zoukankan      html  css  js  c++  java
  • 亲测解决:自定义相机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

  • 相关阅读:
    无法访问计算机XXXX。错误是:库没有注册。
    Unix网卡重启命令
    教你如何进入有密码的 XP 系统
    巧妙恢复被破坏的Windows XP系统文件
    认识容灾备份 构筑一个避风港
    双机热备的实现模式 - 基于共享存储与纯软件方式
    玩大型游戏死机解决方法
    让windows xp开机跳过登陆界面
    在IE7中无法正常访问FTP的解决办法
    STL使用心得
  • 原文地址:https://www.cnblogs.com/cxeye/p/14711740.html
Copyright © 2011-2022 走看看