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
- Spring集成RabbiMQ-Spring AMQP新特性
- Nodejs学习笔记(二)--- 事件模块
- 巧用FireFox来调试Silverlight
- Nodejs学习笔记(一)--- 简介及安装Node.js开发环境
- WCF后续之旅(7):通过WCF Extension实现和Enterprise Library Unity Container的集成
- 区块链技术(一):Truffle开发入门
- Nodejs学习笔记(一)——初识Nodejs
- RabbitMQ入门-Topic模式
- 单分子数据储存取得一大突破,一枚“硬币”存量相当于100部iPhone 7
- Windows 7 旗舰版 VHD安装体验
- Nodejs学习笔记(二)——Eclipse中运行调试Nodejs
- Nodejs学习笔记(三)——一张图看懂Nodejs建站
- 不规则图形的碰撞检测
- 自学WP7第一个例子:时钟
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- python字典的值可以修改吗
- 使用Keras构造简单的CNN网络实例
- Python接口测试环境搭建过程详解
- 使用已经得到的keras模型识别自己手写的数字方式
- 解决keras使用cov1D函数的输入问题
- PHP PDOStatement::getColumnMeta讲解
- PHP PDOStatement::nextRowset讲解
- PHP _construct()函数讲解
- PHP PDOStatement::rowCount讲解
- Python 如何对文件目录操作
- Python字符串split及rsplit方法原理详解
- Laravel框架文件上传功能实现方法示例
- python中如何写类
- 什么是PHP7中的孤儿进程与僵尸进程
- Python爬虫小例子——爬取51job发布的工作职位