由於Android下攝像頭預覽數據只能 ImageFormat.NV21 格式的,所以解碼時要經過一翻周折.
Camera mCamera = Camera.open(); Camera.Parameters p = mCamera.getParameters(); p.setPreviewFormat(ImageFormat.NV21); /*這是唯一值,也可以不設置。有些同學可能設置成 PixelFormat 下面的一個值,其實是不對的,具體的可以看官方文檔*/
mCamera.setParameters(p);
mCamera.startPreview();
下面是解碼核心部分:
@Override public void onPreviewFrame(byte[] data, Camera camera) { Size size = camera.getParameters().getPreviewSize(); try{ YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null); if(image!=null){ ByteArrayOutputStream stream = new ByteArrayOutputStream(); image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream); Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size()); stream.close(); } }catch(Exception ex){ Log.e("Sys","Error:"+ex.getMessage()); } }
代碼很簡單。就是把YUV數據轉成 Bitmap 就行了,系統提供 YuvImage 類。