用.NET解索尼相机ARW格式照片

目前常用的照片格式是 .jpg,它只能提供 8bit的色彩深度,而目前主流的相机都能提供高达 12bit14bit的色彩深度,动态范围和后期处理能力也大大增加,这也是为什么不少摄影爱好者会优先使用相机提供原始格式,也就是 raw格式,它记录了最多的信息。

但相机的 raw格式是厂商提供的,不像 jpg格式,厂商与厂商之间的格式不一样,如索尼相机一般用 .ARW格式、佳能相机用 .CR2格式等等。正常读 raw格式文件会用 Lightroom、 CaptureOne、 CameraRaw之类的软件。但如果拿着相机拍了不少漂亮相片,回家自己想来点“简单”骚操作,转个码,然后用自己搭的 NAS集成一下数据什么的,就需要用到最拿手的 C#了。

想象中读 ARW格式的过程

代码我也不太确定要怎么写,也许……代码就这样?


  1. using var bmp = Bitmap.FromFile(@"D:\A6000\2019-4-6\DSC05458.ARW");

不出所料果然读不了,报错了,异常信息如下:


  1. System.OutOfMemoryException: Out of memory.

  2. at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)

  3. at System.Drawing.Image.FromFile(String filename)

  4. at UserQuery.Main() in C:\Users\sdfly\AppData\Local\Temp\LINQPad6\_xonxdhlt\pzztkn\LINQPadQuery:line 3

请注意,这里抛的是 OutOfMemoryException,看起来很奇怪——这里有必要说一句,根据微软官方提供的文档(https://docs.microsoft.com/en-us/dotnet/api/system.drawing.image.fromfile?view=netframework-4.8),如果 GDI+不支持文件的像素格式,则就会抛 OutOfMemoryException

探寻解决办法

经过一翻 Google和 Stackoverflow的探索,发现原来索尼官方提供了 ARW格式的解码器,下载地址如下:http://ids.update.sony.net/microsoft/SRD20_Installer0810a.exe

下载后安装即可,之后可以在注册表中查看一下,注册表位置如下是 计算机\HKEY_CLASSES_ROOT\CLSID\{7ED96837-96F0-4812-B211-F13C24117ED3}\Instance\{C17F7FAD-D98F-4B2A-8FF2-90E8A5CC0253},发现该组件确实安装正确:

安装完之后再使用 GDI+的 API调用一下,发现仍然会报一样的错。重启一下还是一样,调用 ImageCodecInfo.GetImageDecoders()就能发现,其实在“内置”的解码器里面并没有索尼 ARW文件:


  1. *.BMP;*.DIB;*.RLE

  2. *.JPG;*.JPEG;*.JPE;*.JFIF

  3. *.GIF

  4. *.EMF

  5. *.WMF

  6. *.TIF;*.TIFF

  7. *.PNG

  8. *.ICO

又经过一翻搜寻,原来,索尼提供的这个安装包是集成于 WIC,也就是 WindowsImagingComponents,因为必须要用 WIC的 API, SharpDX.Direct2D1和 WPF都是基于 WIC,按我的习惯肯定会用 SharpDX,但这里为了方便大家我使用了 WPF作为博客示例:


  1. var decoder = BitmapDecoder.Create(new Uri(@"D:\A6000\2019-4-6\DSC05458.ARW"), BitmapCreateOptions.None, BitmapCacheOption.Default);

  2. var transformedBitmap = new TransformedBitmap(decoder.Frames[0], new ScaleTransform(0.3, 0.3));

  3. var jpg = new JpegBitmapEncoder();

  4. jpg.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(transformedBitmap));

  5. using var stream = new MemoryStream();

  6. jpg.Save(stream);

  7. Util.Image(stream.ToArray()).Dump();

该代码成功将索尼的 ARW文件转换为 JPG格式,注意代码中有个 0.3,0.3,是为了显示效果,我将 24M像素的原图缩放了为 30%x30%,运行效果如下:

总结

事实上除了厂商提供的库,还有许多第三方机构也提供解 raw格式的库,如 libraw等等。由于我 WIC用得比较熟悉,我就用 WIC来解了。

本文用到的索尼 ARW文件可以在我的百度网盘中下载:https://pan.baidu.com/s/1kTTpwMHIiprBK2hJGPajRw 提取码: 8vpr

喜欢的朋友 请关注我的微信公众号:【DotNet骚操作】

用.NET解索尼相机ARW格式照片相关推荐

  1. .NET解所有相机RAW格式照片

    再聊.NET解相机RAW格式照片 上次我发了一篇文章<用.NET解索尼相机ARW格式照片>,提到通过安装 SonyRawFileDecoder的方式,然后调用 WindowsImaging ...

  2. arw是什么格式?arw格式用什么软件打开?arw格式怎么转换成jpg

    前言 第一次遇见arw格式的朋友们,一定会有下列疑惑: arw是什么格式? arw格式怎么打开? arw文件怎么转换jpg? arw文件怎么转换png? arw文件怎么转换gif? 今天我们就来一个个 ...

  3. Linux 命令之 unrar -- 解压 rar 格式的文件

    文章目录 一.命令介绍 二.常用选项 三.命令示例 (一)按完整路径解压指定的压缩包到当前目录下 (二)按完整路径且不覆盖已存在文件的方式解压指定的压缩档案到指定的目录下 一.命令介绍 需要安装 ra ...

  4. Linux解压bz2格式文件

    问题 Linux解压bz2格式文件 步骤 1. 在当前目录下打开终端 2. 输入sudo tar-jxf 文件名,可以用-C指定存放的文件夹,顺便说下可以提前创建文件夹,创建语句sudo mkdir ...

  5. Mac 解压rar格式文件(附解压工具包)

    Mac 解压rar格式文件* 工具包(zip格式):http://download.csdn.net/detail/u011445031/9854187 将工具包解压到你安装目录即可. 使用: 打开终 ...

  6. blob格式照片在前端页面的显示

    blob格式照片在前端页面的显示 可用img 标签的src请求后台servlet,servlet部分代码如下: response.setContentType( "image/gif &qu ...

  7. 详解视频封装格式之MP4

    在我之前的一篇文章(什么是视频封装格式和编码格式)中有整理了一下常见的视频封装格式.在上一篇文章(详解视频封装格式之FLV)中重点剖析了FLV格式.在这篇文章中,我们重点剖析一下MP4这种视频封装格式 ...

  8. 苹果手机heic格式照片怎么转成jpg

    苹果自iOS11系统之后默认的是heic图片格式,在电脑和安卓中都无法直接查看,需要将其转换图片格式,苹果手机heic格式照片怎么转成jpg?下面我们一起来看看吧! 使用工具: 电脑.图片 操作方法: ...

  9. linux解压z格式文件夹,使用7zip解决解压zip格式文件名乱码, 最简单的解决解压z...

    使用7zip解决解压zip格式文件名乱码, 最简单的解决解压z 由于中文文件名与英文文件名编码的差异,很容易造成在Linux系统使用unzip命令解压zip格式的压缩包时造成中文文件名乱码. 最简单的 ...

最新文章

  1. Java设计模式之策略模式与状态模式
  2. 加州大学新算法:让智能汽车更精准检测行人
  3. 班尼机器人怎么拆_512个焊点独自焊完,武汉一高中生在机器人比赛中摘得五块奖牌...
  4. nice和taskset命令
  5. 个人网站备案起名_郑州诚信个人商标注册电话
  6. 需要清除memcach缓存方能解决的几个报错
  7. Qt编写自定义控件15-百分比仪表盘
  8. [转] 数学专业参考书整理推荐
  9. Java求取主析取范式、主合取范式、成真赋值、成假赋值、打印真值表
  10. 计算机无法识别建行网银盾,建行网银盾无法识别怎么办 几招办法教你轻松解决...
  11. 【Android】模拟Android微信APK底部的TabHost选项卡
  12. JS怎么唤起百度地图
  13. Tomcat之Directory Listing
  14. Linux中CPU使用率低负载高
  15. 在php的开发环境中如何调取WebService?
  16. 从0开始构建蓝牙耳机研发环境
  17. 20 人机猜拳互动游戏开发
  18. 男女拍照姿势大全!火速收藏ing
  19. 万科成都再现欺诈门,业主集体抵制狗洞式入户
  20. 手动在百度云服务器上安装Mysql8.0

热门文章

  1. 用回溯法找出n个自然数中取r个数的全排列
  2. js 技巧杂引(转)
  3. Teams团队的成员列表API的已知问题
  4. cdh中使用hue使用教程_我可以在户外使用Philips Hue灯泡吗?
  5. dropbox_Google的新存储定价与Microsoft,Apple和Dropbox相比如何
  6. zookeeper的单实例和伪集群部署
  7. MyEclipse的Git配置
  8. 【Python】猜数小游戏(文件操作)
  9. mybatis 返回 插入的主键
  10. ActionContext和ActionSupport的学习