首先问一个问题:在知道我总是要将捕获转换为ImageReader的情况下,初始化并使用Bitmap与camera2 api的最有效方法是什么?
我在玩android camera2的示例,一切都运行得很好。但是,出于我的目的,我总是需要对捕获的静态图像执行一些后期处理,为此我需要一个Bitmap对象。目前,我正在使用BitmapFactory.decodeByteArray(...)使用来自ImageReader.acquireNextImage().getPlanes()[0].getBuffer()的字节(我正在解释)。虽然这样做是可以接受的,但我仍然觉得应该有一种方法来提高性能。捕获是在ImageFormat.Jpeg中编码的,需要再次解码才能得到Bitmap,这似乎是多余的。理想情况下,我会在PixelFormat.RGB_888中获取它们,然后使用Bitmap.copyPixelsFromBuffer(...)将其复制到位图中,但似乎用这种格式初始化ImageReader没有可靠的设备支持。YUV_420_888可能是另一种选择,但环顾四周,似乎需要跳过一些环才能解码成Bitmap。有推荐的方法吗?

最佳答案

问题是你在优化什么。
毫无疑问,jpeg是所有设备支持的最简单格式。把它解码成位图并不像看起来那样是多余的,因为把图片编码成jpeg通常是由某种硬件来完成的。这意味着使用最小带宽将图像从传感器传输到应用程序。在某些设备上,这是获得最大分辨率的唯一方法。BitmapFactory.decodeByteArray(...)通常也由特殊的硬件解码器执行。此调用的主要问题是可能导致内存不足异常,因为输出位图太大。因此,您将发现许多示例do subsampled解码,针对必须在电话屏幕上显示位图的用例进行了调整。
如果您的设备支持rgb_所需的分辨率,请使用它:这需要最少的后处理。但是,缩小这样的图像可能比处理jpeg占用更多的cpu,并且内存消耗可能很大。无论如何,只有很少的设备支持这种格式的相机拍摄。
至于yuv_u888和其他yuv格式,
与jpeg相比,rgb的优势甚至更小。
如果您需要质量最好的图像,并且没有内存限制,那么您应该选择目前大多数高端设备支持的原始图像。你将需要你自己的转换算法,并可能作出不同的适应不同的设备,但至少你将有图片采集的完全命令。

07-24 09:46
查看更多