【问题标题】:Getting the raw RGB data of the android camera获取android相机的原始RGB数据
【发布时间】:2012-05-28 14:52:42
【问题描述】:

我正在开发 Android 上的相机应用程序。我目前正在使用 jpeg 回调进行捕获。我想知道是否有办法获取捕获的原始数据。我知道捕获有一个原始回调,但它总是返回 null。

所以我可以从 jpeg 回调中访问原始数据(RGB 像素的连续)。

编辑:

所以我可以从 jpeg 回调中访问原始数据(YUV 像素的连续)。

【问题讨论】:

标签: android android-camera


【解决方案1】:

我成功地获得了在 rk3288 上运行 android 5.1 的“原始”(YUV422) 图片。

3步获取yuv图片

  1. 初始化缓冲区
  2. 通过 relfexion 致电 addRawImageCallbackBuffer
  3. 在专用回调中获取yuv图片

代码示例

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 图片作为参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多