由於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 類。
