Android Camera拍照預覽圖片90度旋轉

jopen 10年前發布 | 120K 次閱讀 Android開發 移動開發 Android Camera

Camera拍照:

做照相機程序,結果寫好了發現出問題了,預覽的圖像差90度。相關源代碼如下:

   Camera.Parameters params = camera.getParameters();
       params.setPreviewSize(width, height);
       params.setPreviewFrameRate(4);
       params.setPictureFormat(PixelFormat.JPEG);
       params.set("jpeg-quality", 85);
       params.setPictureSize(width, height);
       camera.setParameters(params);
       camera.setPreviewDisplay(sHolder);
       camera.startPreview();
       camera.autoFocus(null);

于是在網上搜索,發現確實存在這樣一個問題,網上的解決方法也各不一致。最后用setDisplayOrientation()方法解決了,修改后的代碼如下:

   Camera.Parameters params = camera.getParameters();
       params.setPreviewSize(height, width);                1
       params.setPreviewFrameRate(4);
       params.setPictureFormat(PixelFormat.JPEG);
       params.set("jpeg-quality", 85);
       params.setPictureSize(height, width);                2
       camera.setParameters(params);
       camera.setDisplayOrientation(90);                    3
       camera.setPreviewDisplay(sHolder);
       camera.startPreview();
       camera.autoFocus(null);

首先添加了代碼3,讓Camera旋轉90度。測試時發現雖然圖像轉回正常,但是上下卻拉長了。進過研究修改代碼1,把長寬顛倒。再測試預覽正常了,但是拍照的時候獲取的圖片卻依然是拉長的,于是修改代碼2。這回拍照正常,但是仍然存在一個問題,保存的圖片是橫著的。

看網上很多人都遇到了這個問題,好像與系統有關,既然沒法在Camera這里搞定,那么就將獲取的Bitmap進行旋轉。程序里通過重寫PictureCallback的onPictureTaken來獲取圖片,代碼是

  Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);

在這里可以對bm進行旋轉,代碼如下:

  Bitmap bm0 = BitmapFactory.decodeByteArray(data, 0, data.length);
      Matrix m = new Matrix();
      m.setRotate(90,(float) bm0.getWidth() / 2, (float) bm0.getHeight() / 2);
      final Bitmap bm = Bitmap.createBitmap(bm0, 0, 0, bm0.getWidth(), bm0.getHeight(), m, true);

這樣保存的圖片就正常了!

 

MediaRecorder錄像:

同樣的預覽問題在錄像中也出現了,但是由于是用MediaRecorder進行錄像,沒有Camera對象,一時比較無措。后來經過網友的提醒,想到了MediaRecorder有setCamera()的方法,于是添加如下代碼:

        Camera c = Camera.open();
            c.setDisplayOrientation(90);
            c.unlock();
            mRecorder.setCamera(c);

這樣預覽的問題就解決了!至于網上很多人說添加mRecorder.setOrientationHint(90); 這個方法并不能改變預覽的角度,這個方法會改變保存后的視頻文件播放時是否是橫向。根據用戶的習慣,最后也添加這個代碼保證在播放視頻是是橫向的。

來自:http://blog.sina.com.cn/s/blog_49e44eb001018p69.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!