11

我正在尝试使用来自 Android 图片的数据。我不喜欢 JPEG 格式,因为最终我会使用灰度数据。YUV 格式对我来说很好,因为前半部分是灰度的。

来自Android开发教程,

public final void takePicture(Camera.ShutterCallback 快门,Camera.PictureCallback raw,Camera.PictureCallback postview,Camera.PictureCallback jpeg)

在 API 级别 5 中添加

触发异步图像捕获。随着图像捕获的进行,相机服务将向应用程序发起一系列回调。拍摄图像后发生快门回调。这可用于触发声音,让用户知道图像已被捕获。原始图像数据可用时发生原始回调(注意:如果没有可用的原始图像回调缓冲区或原始图像回调缓冲区不足以容纳原始图像,则数据将为空)。当缩放的、完全处理的 postview 图像可用时,会发生 postview 回调(注意:并非所有硬件都支持这一点)。jpeg 回调在压缩图像可用时发生。如果应用程序不需要特定的回调,则可以传递 null 而不是回调方法。

它谈论“原始图像数据”。但是,我找不到有关原始图像数据格式的信息?你对此有什么想法吗?

我想获取照片拍摄的照片的灰度数据,数据位于手机内存中,因此不会花费时间从图像文件中写入/读取,或者在不同图像格式之间进行转换。或者也许我必须牺牲一些才能得到它?

4

3 回答 3

12

经过一番搜索,我想我找到了答案:来自Android 教程

“当原始图像数据可用时发生原始回调(注意:如果没有可用的原始图像回调缓冲区或原始图像回调缓冲区不足以容纳原始图像,则数据将为空)。”

请参阅此链接 (2011/05/10) Android:支持原始图像回调的设备 并非所有设备都支持原始图片回调。

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/ZRkeoCD2uyc (2009) Google 的员工 Dave Sparks 说:

“最初的意图是返回一个未压缩的 RGB565 帧,但这被证明是不切实际的。” “我倾向于完全弃用该 API,并将其替换为用于本地信号处理的钩子。”

许多人报告了类似的问题。请参阅: http ://code.google.com/p/android/issues/detail?id=10910

由于很多图像处理过程都是基于灰度图像的,所以我很期待Android为每张图片生成的内存中的灰度原始数据。

于 2013-01-16T18:08:35.787 回答
4

您可能对getSupportedPictureFormats()有一些运气。如果它列出了一些 YUV 格式,您可以使用 setPictureFormat() 和所需的分辨率,并且直观地说,您将在 JpegPreview 回调中获得未压缩的高质量图像,从中可以轻松提取灰度(又名亮度)。

大多数设备只会将 JPEG 列为有效选择。那是因为它们在相机端的硬件中执行压缩。请注意,从相机到应用程序 RAM 的数据传输通常是瓶颈;如果您可以使用 stagefright hw JPEG 解码器,您实际上会更快地获得结果。

于 2013-01-16T21:10:13.243 回答
2

使用原始回调的最大问题是许多开发人员无法在许多手机上返回任何内容。

如果您对 YUV 数组感到满意,您的相机预览SurfaceView可以实现PreviewCallback,您可以将该onPreviewFrame方法添加到您的类中。此函数将允许您直接访问每一帧的 YUV 数组。您可以在选择时获取它。

编辑:我应该指定我假设您正在构建一个自定义相机应用程序,您在其中扩展SurfaceView了自定义相机预览表面。为了遵循我的建议,您需要构建一个自定义相机。如果您想快速完成操作,我建议您从 JPEG 数据中构建一个新的位图,您自己在其中实现灰度。

于 2013-01-10T22:19:16.920 回答