Android:无法从相机获取RAW图像数据?

android android-camera

10913 观看

3回复

46 作者的声誉

目前正计划使用Android设备中的相机提供的RAW数据来制作摄影应用。

我使用相机API编写了一个快速骨架,并注意到在使用RAW图像数据的回调中,给出的数据缓冲区始终为NULL,无论我制作图像的大小,但我能够访问JPG缓冲区。

我做了一些搜索,发现了这个帖子:http//markmail.org/message/sraudbyrsi2hjqfr#query :I% 27m%20talking%20about%20deprecating%20the%20raw%20picture%20callback%20that%20has%20never+ page:1 +中期:sraudbyrsi2hjqfr +状态:结果

其中提到在撰写本文时(2009年2月),它“从未奏效”。那么,我是否正确地认为今天它仍然不起作用,或者我可能错误地设置了什么?

我用来调试的手机是Droid X.

只是困惑,因为我确实看到API提到如果设备上没有足够的可用内存,回调中的RAW数据缓冲区可以为null,但即使我将图像设置为极小的尺寸,它也会返回为null( 100×100)

谢谢

编辑:

添加一些我从LogCat获得的调试输出:

DEBUG / CameraHal(1156):初始化捕获内存raw:0x42d39000(155648),jpg:0x429c4000(57856),pv 0x42d5f000(276736)

DEBUG / CameraHal(1156):收到原始yuv 0x4119f000大小153600
DEBUG / CameraHal(1156):收到jpg 0x429c4000大小57584

DEBUG / CamTest(4716):RAW回调数据为NULL
DEBUG / CamTest(4716):JPEG回调数据有效

“CamTest”是我的自定义调试输出。

作者: David 的来源 发布者: 2010 年 12 月 23 日

回应 (3)


3

35422 作者的声誉

它看起来确实从未奏效。从你的另一个线程看起来它永远不会。

作者: Donnie 发布者: 23.12.2010 12:29

0

41 作者的声誉

仅使用Android L在Nexus 5(可能是7个)上工作

试试这个应用程序:https//github.com/dylian94/android-Camera2Basic

它使用谷歌的新相机API:http//connect.dpreview.com/post/2707133307/google-android-api-camera-raw

作者: Darkjay 发布者: 29.07.2014 07:16

0

1 作者的声誉

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

获得yuv图像的3个步骤

  1. init缓冲区
  2. 调用addRawImageCallbackBuffer由relfexion
  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图片作为参数推送。

作者: Xavier D 发布者: 01.04.2019 10:23
32x32