当前位置: 首页 > news >正文

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

觉得不错,点个在看呗~

相关文章:

  • 华为手机刷微博体验更好?技术角度的分析和思考
  • 播放视频时如何调整音频的音量
  • 视频码控:CBR、VBR和ABR
  • OpenGL ES 相机 LUT 滤镜
  • Android 11 正式发布 | 开发者们的舞台已就绪
  • 刚刚,鸿蒙 OS 2.0 发布!HarmonyOS 将正式开源!
  • 如何给 FFmpeg 添加自定义 Codec 编码器
  • FFmpeg从入门到精通——进阶篇,SEI那些事儿
  • iOS音频采集技术解读:如何实现男女变声的音效?
  • MediaCodec 、x264、faac 实现音视频编码并通过 rtmp 协议实现推流
  • 从《黑神话:悟空》的爆火,浅谈当前游戏从业者面临的机遇与挑战
  • 面试官: 说一下你做过哪些性能优化?
  • NDK系列-如何使用C/C++编写带EGL功能的NativeActivity
  • 短视频 SDK 开发 (一) 开发一款短视频 SDK 需要具备哪些知识?
  • 滴滴AR实景导航背后的技术
  • 2019年如何成为全栈工程师?
  • Django 博客开发教程 8 - 博客文章详情页
  • django开发-定时任务的使用
  • ES10 特性的完整指南
  • FastReport在线报表设计器工作原理
  • javascript面向对象之创建对象
  • nodejs:开发并发布一个nodejs包
  • Node项目之评分系统(二)- 数据库设计
  • SpiderData 2019年2月25日 DApp数据排行榜
  • spring-boot List转Page
  • SpringBoot 实战 (三) | 配置文件详解
  • SQLServer之创建数据库快照
  • VUE es6技巧写法(持续更新中~~~)
  • Vue 重置组件到初始状态
  • 第2章 网络文档
  • 基于游标的分页接口实现
  • 力扣(LeetCode)21
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • Spring第一个helloWorld
  • ​ArcGIS Pro 如何批量删除字段
  • #传输# #传输数据判断#
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (二)fiber的基本认识
  • (二十三)Flask之高频面试点
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (五)关系数据库标准语言SQL
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)项目管理杂谈-我所期望的新人
  • *** 2003
  • .aanva
  • .Net Core和.Net Standard直观理解
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据