Как захватить изображение из пользовательского CameraView в Android?

Мне нужно захватить изображение из требуемой части экрана .

захватить изображение с камеры .

в то время другое содержимое экрана как есть .

введите описание изображения здесь

как это возможно ?

    попробуйте использовать Surface View для создания динамического просмотра камеры и установки в требуемой части.

    следующий код попробовать

    переменные установлены Уровень classа (глобальный)

    Button btn_capture; Camera camera1; SurfaceView surfaceView; SurfaceHolder surfaceHolder; public static boolean previewing = false; 

    Следующий код в методе onCreate ()

     getWindow().setFormat(PixelFormat.UNKNOWN); surfaceView = new SurfaceView(this); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); btn_capture = (Button) findViewById(R.id.button1); surfaceView.setBackgroundResource(R.drawable.your_background_image); if(!previewing){ camera1 = Camera.open(); if (camera1 != null){ try { camera1.setDisplayOrientation(90); camera1.setPreviewDisplay(surfaceHolder); camera1.startPreview(); previewing = true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } btn_capture.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub if(camera != null) { camera1.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG); } } }); 

    Следующий код помещается после onCreate () в вашем classе .

     ShutterCallback myShutterCallback = new ShutterCallback(){ public void onShutter() { // TODO Auto-generated method stub }}; PictureCallback myPictureCallback_RAW = new PictureCallback(){ public void onPictureTaken(byte[] arg0, Camera arg1) { // TODO Auto-generated method stub }}; PictureCallback myPictureCallback_JPG = new PictureCallback(){ public void onPictureTaken(byte[] arg0, Camera arg1) { // TODO Auto-generated method stub Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); Bitmap correctBmp = Bitmap.createBitmap(bitmapPicture, 0, 0, bitmapPicture.getWidth(), bitmapPicture.getHeight(), null, true); }}; public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub if(previewing){ camera1.stopPreview(); previewing = false; } if (camera1 != null){ try { camera1.setPreviewDisplay(surfaceHolder); camera1.startPreview(); previewing = true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub } public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub camera1.stopPreview(); camera1.release(); camera1 = null; previewing = false; } 

    в AndroidManifest.xml дают разрешения пользователя .

        

    а также не забыл (реализует SurfaceHolder.Callback) для classа.

    Я уже создал такую ​​камеру. Я сделал это, я коснулся другой области камеры изображением и срезал центральную часть изображения и сохранил его как файл png, чтобы сделать центр прозрачным.

    С этим изображением вы установите фоновое изображение своего кадра (предварительный просмотр камеры). Чтобы он выглядел так, будто камера – это только часть, прозрачная или круглая.

    Я использовал этот учебник для открытия, создания предварительного просмотра и съемки с устройства камеры. http://developer.android.com/guide/topics/media/camera.html

    в этой части (вы можете видеть это в приведенной выше ссылке)

      private PictureCallback mPicture = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { //this is where you crop your image BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inMutable = true; Bitmap bitmap = BitmapFactory .decodeByteArray(data, 0, data.length, opt); bitmap=Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas mcanvas=new Canvas(bitmap); //do the cropping here, bitmap is the image you will use to crop } } 

    следуйте этому руководству о том, как обрезать изображение на круг. Обрезать круговую область из растрового изображения в Android.

    вы можете использовать поверхностный вид. После захвата изображения вы можете получить bitmap и рисовать canvas также

    http://developer.android.com/reference/android/view/View.html#onDraw(android.graphics.Canvas)

    http://developer.android.com/reference/android/view/SurfaceView.html#setZOrderMediaOverlay(boolean)

    Если часть экрана фактически представляет собой представление, вы можете захватить только это представление. Как это:

     Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),view.getHeight(),Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); view.draw(canvas); 

    Если вы хотите захватить только небольшую часть представления, вам нужно вычислить прямоугольник этой стороны. Затем:

     Bitmap bitmap = Bitmap.createBitmap(rect.width(),rect.height(),Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); canvas.save(); canvas.translate(-rect.left,-rect.top); view.draw(canvas); canvas.restore(); 

    Это всего лишь псевдокод, но я надеюсь, что вы поймете эту идею. Просто переведите и нарисуйте только ту деталь, которая вам нужна.

    Я использую CameraPreview в приложении ApiDemos и редактирую его как ваше требование.

    Сначала скопируйте код classа Preview в новый файл classа в том же пакете, чтобы он был общедоступным, и вы можете объявить его в файле макета xml. Не забудьте добавить еще один конструктор, как показано ниже:

     public Preview(Context context, AttributeSet attrs) { super(context, attrs); mSurfaceView = new SurfaceView(context); addView(mSurfaceView); // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = mSurfaceView.getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } 

    Пример файла макета с шириной и высотой выборки:

            

    В методе onCreate () действия CameraPreview измените часть setContentView следующим образом:

     setContentView(R.layout.camera_layout); mPreview = (Preview) findViewById(R.id.camera_view); 

    используйте TextureView для предварительного просмотра, установите layout_width и layout_height, что хотите. вот код:

     public class MainActivity extends Activity implements TextureView.SurfaceTextureListener { private Camera mCamera; private TextureView mTextureView; /** * Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mTextureView = (TextureView) findViewById(R.id.textureView); mTextureView.setSurfaceTextureListener(this); } @Override public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i2) { mCamera = Camera.open(); try { mCamera.setPreviewTexture(surfaceTexture); mCamera.setDisplayOrientation(90); mCamera.startPreview(); } catch (IOException exception) { } } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i2) { //To change body of implemented methods use File | Settings | File Templates. } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { mCamera.startPreview(); mCamera.release(); return true; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { //To change body of implemented methods use File | Settings | File Templates. } } 

    и xml-файл:

         
    Давайте будем гением компьютера.