ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-04-28 09:36:30  阅读:233  来源: 互联网

标签:自定义 Camera2 前置 Surface private ORIENTATIONS ROTATION append 亲测


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

        

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

 

标签:自定义,Camera2,前置,Surface,private,ORIENTATIONS,ROTATION,append,亲测
来源: https://www.cnblogs.com/cxeye/p/14711740.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有