我正在开发安卓上的相机应用程序。我目前正在使用 jpeg 回调进行捕获。我想知道是否有办法获取捕获的原始数据。我知道捕获有一个原始回调,但它总是返回 null。
所以从 jpeg 回调中我可以访问原始数据(RGB 像素的连续)。
编辑 :
所以从 jpeg 回调中我可以访问原始数据(YUV 像素的连续)。
我正在开发安卓上的相机应用程序。我目前正在使用 jpeg 回调进行捕获。我想知道是否有办法获取捕获的原始数据。我知道捕获有一个原始回调,但它总是返回 null。
所以从 jpeg 回调中我可以访问原始数据(RGB 像素的连续)。
编辑 :
所以从 jpeg 回调中我可以访问原始数据(YUV 像素的连续)。
我成功地获得了在 rk3288 上运行 android 5.1 的“原始”(YUV422)图片。
addRawImageCallbackBuffer
反射调用val weight = size.width * size.height * ImageFormat.getBitsPerPixel(ImageFormat.NV21) / 8
val bytes = ByteArray(weight);
val camera = android.hardware.Camera.open();
try {
val addRawImageCallbackBuffer = camera.javaClass
.getDeclaredMethod("addRawImageCallbackBuffer", bytes.javaClass)
addRawImageCallbackBuffer.invoke(camera, bytes)
} catch (e: Exception) {
Log.e("RNG", "Error", e);
}
...
camera.takePicture(null, { data, camera ->
val file = File("/sdcard/output.jpg")
file.createNewFile()
val yuv = YuvImage(data, ImageFormat.NV21, size.width, size.height, null)
yuv.compressToJpeg(Rect(0, 0, size.width, size.height), 80, file.outputStream())
}, null)
该Camera.takePicture()
方法将 raw 的回调作为第二个参数。
camera.takePicture ( shutterCallback, rawCallback, jpegCallback );
这个回调将返回一个null
byteArray,除非我先明确地为原始图像添加一个缓冲区。
所以,你应该为此打电话camera.addRawImageCallbackBuffer
。
尽管如此,该方法不可用(公共但未导出,因此您不能直接调用它)。
幸运的是,代码示例演示了如何通过反射强制调用此方法。这将使原始缓冲区推送一致的 yuv 图片作为参数。