我已经实现了一个简单的应用程序,在屏幕上显示相机图片 . 我现在要做的是抓取一个帧并将其作为位图处理 . 从我能找到的东西到这一点,这不是一件容易的事 .
我已经尝试使用onPreviewFrame方法,您将当前帧作为字节数组,并尝试使用BitmapFactory类解码它,但它返回null . 帧的格式是无头YUV,可以转换为位图,但在手机上需要太长时间 . 另外我已经读过onPreviewFrame方法在运行时有约束,如果它需要太长时间,应用程序可能会崩溃 .
那么这样做的正确方法是什么?
4 回答
在API 17中,您可以使用'ScriptIntrinsicYuvToRGB'RenderScript从NV21转换为RGBA888 . 这使您可以轻松处理预览帧而无需手动编码/解码帧:
好吧我们最终做的是使用onPreviewFrame方法并使用可以在android帮助组中找到的方法在单独的线程中解码数据 .
...
链接:http://groups.google.com/group/android-developers/browse_thread/thread/c85e829ab209ceea/3f180a16a4872b58?lnk=gst&q=onpreviewframe#3f180a16a4872b58
我实际上尝试了前面给出的代码,发现Colorvalues不准确 . 我通过预览和直接返回JPEG数组的camera.takePicture检查了它 . 而且颜色非常不同 . 经过一点点搜索后,我发现了另一个将PreviewImage从YCrCb转换为RGB的例子:
由this和takePicture()给出的颜色值完全匹配 . 我想我应该在这里张贴 . This is where I got this code from.希望这有帮助 .
Tim的RenderScript解决方案很棒 . 这里有两条评论:
创建并重用
RenderScript rs
和Allocation in, out
. 每一帧创建它们都会影响性能 .RenderScript support library可以帮助您支持Android 2.3 .