佳能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 音视频入门项目
觉得不错,点个在看呗~