带有原始图片回调的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相机是啥格式?的主要内容,如果未能解决你的问题,请参考以下文章