Android 手机如何拍摄RAW图

音视频开发进阶

共 2938字,需浏览 6分钟

 ·

2021-10-28 11:46

佳能5D Mark III

专业玩摄影的朋友可能更倾向于使用相机的RAW格式,然后自己做后期处理,而不是直接拍摄JPEG格式的图片。


什么是RAW格式图片


无论是专业的数码相机还是手机的影像系统,Camera的处理流程都是类似的(关于手机的影像系统可参考之前的文章数字成像系统概述):

可以看到RAW格式的图像是由相机感光元件接受的原始图像数据组成,同时包含文件创建时的相机设置和图像处理参数;

而JPEG格式的图像是经过图像处理(如白平衡,锐化,色调和对比度等)后的数据;

为什么专业摄像爱好者偏爱于RAW格式的图片?


除了RAW格式包含的未经处理的原始数据让后期能有更大的操作空间(例如RAW格式文件比JPEG格式在高光和阴影区域能够保留更多的细节,可以在后期将过爆和欠曝的照片拉回正常的曝光范围)外,通常图像软件对RAW格式的任何后期调整都是“非破坏性的”,也就是说不会改变原始文件而是创建了一个新的JPEG或者TIFF格式的图片副本。这样的优势可以让后期制作无限次进行,直到满意为止。


Android手机拍摄RAW图


我们使用Android Camera2的API来拍摄RAW图,关于Camera2的基础可以参考Android Camera2详解

1. 查询是否支持RAW图输出

首先需要查询Camera是否支持直接输出RAW格式的图片,如果没有找到任何一颗摄像头,就需要换一台测试设备了(现在国内的头部手机厂商的中高端机型基本都是支持的)

// We only use a camera that supports RAW. if (!contains(characteristics.get(         CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES),         CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {          continue;  }

2. 配置RAW图的输出尺寸

通过ImageFormat.RAW_SENSOR格式从StreamConfigurationMap中查询支持的size列表并选择合适的size

Size largestRaw = Collections.max(          Arrays.asList(map.getOutputSizes(ImageFormat.RAW_SENSOR)),          new CompareSizesByArea());

3. 配置输出Raw的Surafce

mRawImageReader = ImageReader.newInstance(largestRaw.getWidth(),   largestRaw.getHeight(), ImageFormat.RAW_SENSOR, /*maxImages*/ 5);mRawImageReader.setOnImageAvailableListener(                            mOnRawImageAvailableListener, mBackgroundHandler);

4. 拍照并保存

在拍摄JPEG图片的时候,我们只需要在拿到JPEG数据然后进行保存即可。但是在拍摄RAW图的场景下,拿到原始数据后,还需要保存本次拍照所设置的参数配置信息,并且打包到一个文件中去。


不同专业数码相机厂商的摄像机设置RAW格式后所拍摄的图像文件的后缀名并不一定就是xx.RAW。


各家相机厂商会采用不同的编码方式来记录RAW数据,所以后缀名也不会相同,如下图片都是RAW格式的图片,可以看到格式种类繁多:

过多的RAW格式导致图像处理软件兼容性工作极具挑战性,对软件开发者和摄影师都不友好,为了解决这些冲突,Adobe公司在2004年推出了统一的RAW文件格式DNG(Digital Negative)。DNG的推出受到了不少软件制造商的支持,比如Extensis,Canto,iView等,不少著名的相机制造商,如Leica,三星等也都推出了直接支持DNG的相机。


不过由于该DNG的标准还由Adobe掌控,而不是一个中立的行业标准,导致它的支持覆盖率并不高。


奥林巴斯单反相机部的产品经理John Knaur说:“目前,我们还没有看到这种格式成为一种跨平台的事实标准,它还只是Adobe 控制的一种图片格式” (来自参考资料2)


当然,Android SDK中已经提供了能将原始Camera数据和拍照的配置参数直接封装为DNG文件的工具类DngCreator,我们直接用它来保存RAW图即可

// mCharacteristics:该摄像头的静态配置信息// mCaptureResult:本次拍照的配置信息// mImage:封装的原始图像数据DngCreator dngCreator = new DngCreator(mCharacteristics, mCaptureResult);FileOutputStream output = null;try {      output = new FileOutputStream(mFile);      dngCreator.writeImage(output, mImage);} catch (IOException e) {      e.printStackTrace();} finally {      mImage.close();      closeOutput(output);}

使用RedMi K30拍摄RAW图,在手机相册中查看,可以看到具有RAW的标识:

Demo图


将DNG图片导出到电脑,使用Photoshop Camera Raw打开,然后自己后期处理即可


注:

1. 文章演示代码均来自Google官方例子,可github进行搜索或加我好友获取;

2. 文章部分图片来自于网络,侵权请联系进行删除~;


参考

1.【从零开始玩单反 相机参数之RAW格式详解】

    http://dcdv.zol.com.cn/259/2596442.html

2.【DNG百度词条】

    https://baike.baidu.com/item/.DNG格式/1797443?fr=aladdin

3.【到底什么是RAW格式文件】

    https://fotomen.cn/2018/06/28/what-raw/




技术交流,欢迎加我微信:ezglumes ,拉你入技术交流群。

推荐阅读:

音视频面试基础题

OpenGL ES 学习资源分享

一文读懂 YUV 的采样与格式

OpenGL 之 GPUImage 源码分析

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~

浏览 67
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报