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

創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()