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