亲测解决:自定义相机Camera2前后置拍照时相片翻转、旋转等显示问题

一开始我遇到的问题是,前置拍照获得的照片各种旋转、 翻转,就是不能正常,解决后的前后置拍照得到的图片都正常了,效果图如下(看底部中间显示的相片):

        

自定义相机的实现,网上有很多代码了,我这里不贴全部的代码,就贴解决前后置拍照怎么处理照片使其正常 (记得给相关权限),布局中用到的是TextureView控件。

 

1.前后置时的SparseIntArray 设置(默认的是前置,一开始调用front())

     private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
     
        private void front() {
            //前置时,照片竖直显示
            ORIENTATIONS.append(Surface.ROTATION_0, 270);
            ORIENTATIONS.append(Surface.ROTATION_90, 0);
            ORIENTATIONS.append(Surface.ROTATION_180, 90);
            ORIENTATIONS.append(Surface.ROTATION_270, 180);
        }
     
        private void rear() {
            //后置时,照片竖直显示
            ORIENTATIONS.append(Surface.ROTATION_0, 90);
            ORIENTATIONS.append(Surface.ROTATION_90, 0);
            ORIENTATIONS.append(Surface.ROTATION_180, 270);
            ORIENTATIONS.append(Surface.ROTATION_270, 180);
        }

2.切换前后置相机时做的处理

    private String mCameraId = "1";//摄像头id(通常0代表后置摄像头,1代表前置摄像头)(应该有个按钮可以改变前后置的)
    private CameraDevice cameraDevice;
    private CameraCaptureSession mPreviewSession;
    private CameraManager manager;
     
    //stateCallback是摄像头状态
    private void switch(){
         if ("1".equals(mCameraId)) {//前置变后置
                    mCameraId = "0";
                    rear();
                }else {//其它全部变成前置(默认的是前置)
                    mCameraId = "1";
                    front();
                }
                if (mPreviewSession != null) {
                    mPreviewSession.close();
                    mPreviewSession = null;
                }
                if (cameraDevice != null) {
                    cameraDevice.close();
                    cameraDevice = null;
                }
                try {
                    manager.openCamera(mCameraId, stateCallback, null);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
     
    }

 3.获取拍照的照片,并对其进行处理,使其正常,在ImageReader.OnImageAvailableListener的onImageAvailable方法里面,代码如下处理:

              // 获取捕获的照片数据
                Image image = reader.acquireNextImage();
                ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                byte[] data = new byte[buffer.remaining()];
                buffer.get(data);
     
               Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
                //前置时左右翻转时处理,后置是正常的,不需要处理了
                if ("1".equals(mCameraId)){
                    Matrix m = new Matrix();
                    m.postScale(-1, 1); // 镜像水平翻转
                     bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);
                }
                ivImage.setImageBitmap(bitmap);
     
                    image.close();//一定要,不能会……,你试试看
————————————————
版权声明:本文为CSDN博主「週莫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40420578/article/details/104612819

 

posted @ 2021-04-28 09:06  春天又来了  阅读(1419)  评论(0编辑  收藏  举报