有证据表明Android的相机预览数据在NV21(YUV 420)中返回。 2.2添加了一个YuvImage类来解码数据。我遇到的问题是YuvImage类数据显示为损坏或不正确。我使用了名为HelloCompute的Renderscript示例应用程序,它将位图转换为单色铬位图。我使用两种方法将预览数据解码为位图并将其作为输入传递给Renderscript:
方法1 - Android YuvImage类:
YuvImage preview = new YuvImage(data,ImageFormat.NV21,width,height,null);
ByteArrayOutputStream mJpegOutput = new ByteArrayOutputStream(data.length);
preview.compressToJpeg(new Rect(0,0,width,height),100,mJpegOutput); mBitmapIn = BitmapFactory.decodeByteArray(mJpegOutput.toByteArray(),0,mJpegOutput.size());
//将mBitmapIn传递给RS
方法2 - 发布解码器方法: 已发布over here by David Pearlman
//解决Yuv格式
mBitmapIn = Bitmap.createBitmap( ImageUtil.decodeYUV420SP(数据,宽度,高度), 宽度, 高度, Bitmap.Config.ARGB_8888);
//将mBitmapIn传递给RS
当Renderscript处理图像并显示时,方法1非常粗糙而不是单色,而方法2产生预期输出,即预览帧的单色图像。我做错了还是YuvImage类不可用?我正在运行3.1的Xoom上测试它。
此外,我在传递给RS之前在屏幕上显示了两种方法产生的位图。方法1中的位图在光照方面有明显差异(我怀疑这是由于JPeg压缩),而方法2的位图与预览帧相同。
答案 0 :(得分:1)
没有理由使用Jpeg编码/解码将YUV图像转换为灰度位图(我相信你想要灰度,而不是单色黑白位图)。您可以找到许多产生所需结果的代码示例。你可以使用这个:Converting preview frame to bitmap。