佳能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/

技术交流或头条内推欢迎扫码添加我的微信:wxid_alaiye

推荐

1. 数字成像系统概述

2. 3A之自动白平衡(AWB)篇

3. Android 11 强制用户使用系统相机?

4. 【Camera效果】高通 AF 搜索与控制机制(MSM8909)

5. JPEG图像是如何进行压缩编码的

觉得不错,点个在看呗~

android raw获取uri_Android 手机如何拍摄RAW图相关推荐

  1. Android 开发获取当前手机厂商的方法和获取允许后台活动权限

    获取当前手机厂商: 1. if (checkPhoneFirm().equals(PhoneConstant.IS_HUAWEI)) {//华为 // getPermisstion("hua ...

  2. Android 手机如何拍摄RAW图

    佳能5D Mark III 专业玩摄影的朋友可能更倾向于使用相机的RAW格式,然后自己做后期处理,而不是直接拍摄JPEG格式的图片. 什么是RAW格式图片 无论是专业的数码相机还是手机的影像系统,Ca ...

  3. 华为+android+root权限获取root,[Android]如何获取华为手机的root权限

    手机根具有许多优点. 在Android系统中,root是系统的唯一超级用户. 植根Android手机后,您可以随意卸载系统随附的许多程序,并且可以自由更改手机的命令以使手机更适合自己使用. 习惯. A ...

  4. Android实例-获取安卓手机WIFI信息(XE8+小米2)

    结果: 1.必须打开Access wifi state权限,不打开权限会出图二的错误. 相关资料: http://blog.csdn.net/lyf_lyf/article/category/1735 ...

  5. android设备获取 关于手机-》手机名称

    BluetoothAdapter myDevice = BluetoothAdapter.getDefaultAdapter();  String deviceName = myDevice.getN ...

  6. android raw获取uri_音频-获取存储在android的res / raw文件夹中的.mp3文件的URI

    音频-获取存储在android的res / raw文件夹中的.mp3文件的URI 我在res / raw文件夹中存储了许多.mp3文件. 我正在使用以下代码获取.mp3文件的URI. Uri.pars ...

  7. Android开发实战《手机安全卫士》——5.“高级工具”模块实现 获取经纬度 锁屏 卸载

    文章目录 1.手机防盗--接收短信播放音乐 2.手机防盗--定位方式 3.手机防盗--获取经纬度坐标 4.手机防盗--设备管理器使用 5.手机防盗--锁屏 & 数据清除 & 卸载 6. ...

  8. Android之获取手机基本信息、内存信息、网路信息、电池信息,等一共18项数据

    获取手机信息,代码复制可用,开发工具为:Android Studio 1.手机品牌 2.手机型号 3.屏幕分辨率 4.像素密度 5.屏幕尺寸 6.Android 系统版本 7.运行内存 8.储存空间 ...

  9. Android适配 获取手机屏幕的分辨率

    如何将一个应用程序适配在不同的手机上,虽然这不算是一个技术问题,但是对于刚刚做屏幕的开发人员来说,还真不是一件多么简单的事情. 首先:你需要在AndroidManifest.xml文件的<man ...

最新文章

  1. Ubuntu16.04 下的网易云出现网络异常、无法播放,界面无响应问题的统一解决
  2. 【spring】di(依赖注入)使用实例
  3. 【PHP 开发】mac 下配置 PHP 环境的方法
  4. HTML——CSS的基础语法2
  5. [css] 你有用过弹性布局吗?说说你对它的理解
  6. python 模拟浏览器selenium_使用Selenium模拟浏览器,实现自动爬取数据
  7. Unity 血条跟随效果
  8. _wsplitpath_s
  9. mt4代理服务器存放文件,MT4指标EA DLL等文件放置目录
  10. android 动态壁纸 例子,android 动态壁纸实例(1)【转】
  11. sparkSQL写入hive报错:Exception thrown when executing query
  12. 天地波超视距雷达在远洋无人航运中的运用
  13. FlyoutMenus
  14. ClickHouse基本语法及常见存储引擎
  15. VUE-鼠标移入到目标区域变成小手模样
  16. .net framework 官方下载地址
  17. 塑胶模具设计:从材料优缺点来看塑料特性
  18. H5图片高度根据宽度自适应
  19. 拉格朗日插值、分段线性插值、三次样条插值
  20. 【CEC2017】CEC2017优化算法目标测试函数综述以及CEC2017的matlab实现

热门文章

  1. Android Studio 使用 Logcat 写入和查看日志
  2. SAP IDES 4.7 彻底 破解
  3. 电子商务网站 示例-用的哪种平台软件
  4. docker从入门到入土(基础篇)
  5. 开发者福利 | 2020最全站长工具名单下载
  6. 深度解剖dubbo源码
  7. 【NOIOL】【数论 / 数值】正反切函数的应用
  8. 华为路由器升级系统文件
  9. 通用型AI算法服务器硬件配置有哪些?
  10. IAR contains unknow tools 解决方法