Android 手机如何拍摄RAW图

佳能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 音视频入门项目

觉得不错,点个在看呗~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值