我正在尝试使用Android图片中的数据。我不喜欢JPEG格式,因为最终我会使用灰度数据。 YUV格式对我很好,因为前半部分是灰度级的。
来自Android开发教程,
public final void takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw,Camera.PictureCallback postview, Camera.PictureCallback jpeg)
在API级别5中添加
触发异步图像捕获。相机服务将 作为图像捕获启动对应用程序的一系列回调 进展。捕获图像后发生快门回调。 这可以用于触发声音以让用户知道该图像 已被抓获。原始图像数据时发生原始回调 可用(注意:如果没有原始图像,数据将为null 回调缓冲区可用或原始图像回调缓冲区不可用 大到足以容纳原始图像)。发布回调时发生 可以使用缩放的,完全处理的postview图像(注意:不是全部 硬件支持这个)。压缩后发生jpeg回调 图像可用。如果应用程序不需要特定的 回调,可以传递null而不是回调方法。
它谈到“原始图像数据”。但是,我找不到有关原始图像数据格式的信息? 你对此有什么想法吗?
我想获取照片拍摄的照片的灰度数据,并且数据位于手机存储器中,因此从图像文件写入/读取或在不同图像格式之间转换不会花费时间。或者也许我必须牺牲一些才能得到它?
答案 0 :(得分:12)
经过一番搜索后,我想我找到了答案: 来自Android tutorial:
“原始图像数据可用时发生原始回调(注意: 如果没有原始图像回调缓冲区,则数据将为null 可用或原始图像回调缓冲区不够大,无法容纳 原始图片。“
查看此链接(2011/05/10) Android: Raw image callback supported devices 并非所有设备都支持raw pictureCallback。
https://groups.google.com/forum/?fromgroups=#!topic/android-developers/ZRkeoCD2uyc(2009) 谷歌的员工戴夫斯帕克斯说:
“最初的意图是返回一个未压缩的RGB565帧,但是 事实证明这是不切实际的。 “”我倾向于弃用该API 完全用钩子替换它以进行原生信号处理。 “
许多人报告了类似的问题。看到: http://code.google.com/p/android/issues/detail?id=10910
由于许多图像处理过程都是基于灰度图像,我期待Android中为每张图片生成的内存中的灰度原始数据。
答案 1 :(得分:4)
你可能会对getSupportedPictureFormats()感到幸运。如果它列出了一些YUV格式,你可以使用setPictureFormat()和所需的分辨率,并且可以直观地获得JpegPreview回调中的未压缩高质量图像,从中可以轻松提取灰度(a.k.a.亮度)。
大多数设备只会将JPEG列为有效选项。那是因为他们在相机端的硬件中执行压缩。请注意,从相机到应用程序RAM的数据传输通常是瓶颈;如果你可以使用stagefright hw JPEG解码器,你实际上会更快地得到结果。
答案 2 :(得分:2)
使用原始回调的最大问题是许多开发人员无法在许多手机上获得任何返回。
如果您对YUV阵列感到满意,那么您的相机预览SurfaceView
可以实现PreviewCallback
,您可以将onPreviewFrame
方法添加到您的班级。此功能允许您直接访问每帧的YUV数组。您可以在选择时获取它。
编辑:我应该指定我假设您正在构建一个自定义相机应用程序,在该应用程序中,您为自定义相机预览表面扩展了SurfaceView
。为了遵循我的建议,您需要构建一个自定义相机。如果你想快速做一些事情,我建议你自己用JPEG数据构建一个新的位图,你自己实现了灰度。