親測解決:自定義相機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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM