我正在使用Android Studio,我正在创建一个启动相机预览的应用,并处理onPreviewFrame(byte[] data, Camera camera)
android.hardware.Camera
回调方法中返回的图像。返回的数据采用NV21
格式( Camera类的默认值)。在这种方法中,我收到一个raw
图像,我需要将其转换为RGB
图像才能处理它,因为我的应用程序需要处理图像中的颜色。我使用以下方法将byte[]
数组转换为位图,然后适当地使用位图。
private Bitmap getBitmap(byte[] data, Camera camera) {
// Convert to JPG
ByteArrayOutputStream baos = new ByteArrayOutputStream();
previewSize = camera.getParameters().getPreviewSize();
yuvimage = new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null);
yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 80, baos);
jdata = baos.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(jdata, 0, jdata.length);
// rotate image
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), mtx, true);
return bitmap;
}
这种方法效果很好,我得到了理想的结果。但由于我的预览大小设置为运行应用程序的设备所支持的最大值(目前在我的手机1920x1088
上),因此此方法耗时太长,因此我每秒只能处理1到2张图像。如果我删除转换方法,我可以看到onPreviewFrame
方法每秒被调用10到12次,这意味着我每秒可以收到那么多,但由于转换,我只能处理1或2。
我是否可以使用更快的方式从传递的RGB
数组中接收byte[]
矩阵?
答案 0 :(得分:0)
实际上在我的情况下,删除位图的旋转就足够了,因为解码位图需要250-350ms
并且旋转位图需要~500ms
。所以我删除了旋转并改变了扫描的方向。 Fortunetly这根本不难。如果我有一个函数检查给定像素的颜色,它看起来像这样:
boolean foo(int X, int Y) {
// statements
// ...
}
现在看起来像这样:
boolean foo(int X, int Y) {
int oldX = X;
int oldY = Y;
Y = bitmap.getHeight() - oldX;
X = oldY;
// statements
// ...
}
希望这会有所帮助。 :)