我正在尝试从相机预览中获取位图图像,我将在执行面部检测后对其进行一些处理并绘制一些叠加层。
环顾四周后,我发现 onPreviewFrame 获取的字节数组无法直接解码为位图,需要使用 YuvImage 将其转换为正确的像素格式,而这正是我所做的:
@Override
public void onPreviewFrame(byte[] data, Camera camera)
{
YuvImage temp = new YuvImage(data, camera.getParameters().getPreviewFormat(), camera.getParameters().getPictureSize().width, camera.getParameters().getPictureSize().height, null);
ByteArrayOutputStream os = new ByteArrayOutputStream();
temp.compressToJpeg(new Rect(0, 0, temp.getWidth(), temp.getHeight()), 80, os);
Bitmap preview = BitmapFactory.decodeByteArray(os.toByteArray(), 0, os.toByteArray().length);
/* DO SOMETHING WITH THE preview */
}
问题是,“预览”对象不为空,但它显然不是有效的位图。在调试器上,我可以看到 mWidth 和 mHeight 都设置为 -1,这对我来说似乎是错误的。我究竟做错了什么?
在 API 级别 8 或更高级别上,您可以非常快速地将图像压缩为
JPEG 使用以下代码。
public void onPreviewFrame(byte[] data, Camera arg1) {
FileOutputStream outStream = null;
try {
YuvImage yuvimage = new YuvImage(data,ImageFormat.NV21,arg1.getParameters().getPreviewSize().width,arg1.getParameters().getPreviewSize().height,null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0,0,arg1.getParameters().getPreviewSize().width,arg1.getParameters().getPreviewSize().height), 80, baos);
outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));
outStream.write(baos.toByteArray());
outStream.close();
Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
Preview.this.invalidate();
}
From https://code.google.com/p/android/issues/detail?id=823#c37 https://code.google.com/p/android/issues/detail?id=823#c37
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)