带有原始图片回调的Android相机是啥格式?

Posted

技术标签:

【中文标题】带有原始图片回调的Android相机是啥格式?【英文标题】:What format is for Android camera with raw pictureCallback?带有原始图片回调的Android相机是什么格式? 【发布时间】:2012-12-22 23:41:56 【问题描述】:

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

来自 Android 开发教程,

public final void takePicture(Camera.ShutterCallback 快门, Camera.PictureCallback 原始,Camera.PictureCallback 后视图, Camera.PictureCallback jpeg)

在 API 级别 5 中添加

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

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

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

【问题讨论】:

如果我正确阅读文档,它是一个字节数组:developer.android.com/reference/android/hardware/… 谢谢。我知道它是字节数组。我的意思是,是 YUV 格式,还是 JPEG 格式,还是其他格式? Guide developer.android.com/guide/topics/media/… 现在建议 PictureCallback.getOutputMediaFile(MEDIA_TYPE_IMAGE) 返回默认格式。 【参考方案1】:

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

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

查看此链接 (2011/05/10) Android: Raw image callback supported devices 并非所有设备都支持 raw pictureCallback。

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为每张图片生成的内存中的灰度原始数据。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

谢谢。我以前做过。支持的预览大小具有较低的分辨率,这对于我的应用程序来说是不够的。

以上是关于带有原始图片回调的Android相机是啥格式?的主要内容,如果未能解决你的问题,请参考以下文章

raw是啥格式文件?raw格式图片怎么打开

相机中的RAW是啥意思?

相机中的RAW是啥意思?

手机相机raw是啥意思

Android:如何通过回调显示相机预览?

如何使用Android中的Camera.Parameter在黑白模式下打开和捕捉相机图片