亲测解决:自定义相机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();//一定要,不能会……,你试试看

如有更好的解决方法,请告知,谢谢!

发布了70 篇原创文章 · 获赞 11 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_40420578/article/details/104612819