用.NET解索尼相机ARW格式照片
用.NET解索尼相机ARW格式照片
目前常用的照片格式是.jpg
,它只能提供8bit
的色彩深度,而目前主流的相机都能提供高达12bit
-14bit
的色彩深度,动态范围和后期处理能力也大大增加,这也是为什么不少摄影爱好者会优先使用相机提供原始格式,也就是raw
格式,它记录了最多的信息。
但相机的raw
格式是厂商提供的,不像jpg
格式,厂商与厂商之间的格式不一样,如索尼相机一般用.ARW
格式、佳能相机用.CR2
格式等等。正常读raw
格式文件会用Lightroom
、Capture One
、Camera Raw
之类的软件。但如果拿着相机拍了不少漂亮相片,回家自己想来点“简单”骚操作,转个码,然后用自己搭的NAS
集成一下数据什么的,就需要用到最拿手的C#
了。
想象中读ARW
格式的过程
代码我也不太确定要怎么写,也许……代码就这样?
using var bmp = Bitmap.FromFile(@"D:\A6000\2019-4-6\DSC05458.ARW");
不出所料果然读不了,报错了,异常信息如下:
System.OutOfMemoryException: Out of memory.
at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
at System.Drawing.Image.FromFile(String filename)
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
文件:
*.BMP;*.DIB;*.RLE
*.JPG;*.JPEG;*.JPE;*.JFIF
*.GIF
*.EMF
*.WMF
*.TIF;*.TIFF
*.PNG
*.ICO
又经过一翻搜寻,原来,索尼提供的这个安装包是集成于WIC
,也就是Windows Imaging Components
,因为必须要用WIC
的API
,SharpDX.Direct2D1
和WPF
都是基于WIC
,按我的习惯肯定会用SharpDX
,但这里为了方便大家我使用了WPF
作为博客示例:
var decoder = BitmapDecoder.Create(new Uri(@"D:\A6000\2019-4-6\DSC05458.ARW"), BitmapCreateOptions.None, BitmapCacheOption.Default);
var transformedBitmap = new TransformedBitmap(decoder.Frames[0], new ScaleTransform(0.3, 0.3));
var jpg = new JpegBitmapEncoder();
jpg.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(transformedBitmap));
using var stream = new MemoryStream();
jpg.Save(stream);
Util.Image(stream.ToArray()).Dump();
该代码成功将索尼的ARW
文件转换为JPG
格式,注意代码中有个0.3, 0.3
,是为了显示效果,我将24M
像素的原图缩放了为30% x 30%
,运行效果如下:
总结
事实上除了厂商提供的库,还有许多第三方机构也提供解raw
格式的库,如libraw
等等。由于我WIC
用得比较熟悉,我就用WIC
来解了。
本文用到的索尼ARW
文件可以在我的百度网盘中下载:https://pan.baidu.com/s/1kTTpwMHIiprBK2hJGPajRw 提取码: 8vpr
。
喜欢的朋友 请关注我的微信公众号:【DotNet骚操作】
用.NET解索尼相机ARW格式照片的更多相关文章
- .NET解所有相机RAW格式照片
再聊.NET解相机RAW格式照片 上次我发了一篇文章<用.NET解索尼相机ARW格式照片>,提到通过安装Sony Raw File Decoder的方式,然后调用Windows Imagi ...
- Log4j使用详解(log4j.properties格式)
Log4j使用详解(log4j.properties格式) 1.Log4j 的引入 在应用程序中添加日志记录总的来说基于三个目的: ① 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计 ...
- 如何打开iPhone 中的heic格式照片
苹果手机拍出来的heic照片相比常见的格式占存更小,但是在安卓和电脑上这种格式无法直接查看,那怎么在电脑上查看呢,需要将其转换格式就可以查看,关于如何打开iPhone 中的heic格式照片,下面即将为 ...
- 解压gzip格式文件(包括网页)
先上源码 参数说名: - source :gzip格式流内容. - len: gzip流长度 - dest: 解压后字符流指针 - gzip: 压缩标志,非0时解压gzip格式,否则按照zip解压 说 ...
- Java实现文件压缩与解压[zip格式,gzip格式]
Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例. zip扮演着归档和压缩两个角色:gzip并 ...
- 使用SevenZipSharp压缩/解压7z格式
7z格式采用的LZMA算法,号称具有现今最高压缩率.笔者在nuget上搜索7z,在搜索结果中最终选择了SevenZipSharp来进行压缩/解压.不得不说,SevenZipSharp的API设计得非常 ...
- 使用commons-compress解压GBK格式winzip文件到UTF8,以及错误使用ZipArchiveInputStream读出来数据全是空的解决办法
先上正确方法: 正确方式应该为,先创建一个ZipFile,然后对其entries做遍历,每一个entry其实就是一个文件或者文件夹,检测到文件夹的时候创建文件夹,其他情况创建文件,其中使用zipFil ...
- Linux下批量解压.Z格式文件
下面的代码演示如何将当前目录下sj目录下的所有.Z格式文件解压到sj_result目录下. 代码示例: for file in `ls ./sj` do prefix=${file%.*} echo ...
- dlopen代码详解——从ELF格式到mmap
最近一个月的时间大部分在研究glibc中dlopen的代码,基本上对整个流程建立了一个基本的了解.由于网上相关资料比较少,走了不少弯路,故在此记录一二,希望后人能够站在我这个矮子的肩上做出精彩的成果. ...
随机推荐
- csp-s模拟测试101的T3代码+注释
因为题目过于大神所以单独拿出来说.而且既然下发std了颓代码貌似也不算可耻233 很难讲啊,所以还是写在代码注释里面吧 因为比较认真的写了不少注释,所以建议缩放到80%观看,或者拿到gedit上 1 ...
- [考试反思]0904NOIP模拟测试37:守望
100分并列的还有4个没粘 总分是大脸的一半,然而还只低了2名.差距好大...但其实后面的分数段又很密集,和我都差不了多少... 我可能也是最水的那一个,排行榜前7个里面就我没有AC.全是暴力... ...
- Zookeeper作为配置中心使用说明
为了保证数据高可用,那么我们采用Zookeeper作为配置中心来保存数据.SpringCloud对Zookeeper的集成官方也有说明:spring_cloud_zookeeper 这里通过实践的方式 ...
- 原生JS实现二叉搜索树(Binary Search Tree)
1.简述 二叉搜索树树(Binary Search Tree),它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子 ...
- vue+element UI + axios封装文件上传及进度条组件
1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...
- 14 Zabbix4.4.0系统实现监控checkpoint设备
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 14 Zabbix4.4.0系统实现监控checkpoint设备 1. 前期规划信息 2. 配置 ...
- 算法编程题积累(1)——网易笔试"工程师工作安排“问题
首先理解题目意思:每个人只能做工作序号表里的一件工作且两个人不能同时做一件工作.AC思路:采用暴力枚举每种可能的分配方案,子问题的解决逐步向上解决了母问题,最终原问题得解. 标程作者:NotDeep( ...
- react-router-dom路由
- windows 10 上源码编译opengv | compile opengv on windows 10 from source
本文首发于个人博客https://kezunlin.me/post/51cd9fa0/,欢迎阅读! compile opengv on windows 10 from source Series co ...
- MySQL常用的查询语句回顾
让你快速复习语句的笔记宝典. create table users( username varchar(20) primary key, userpwd varchar(20) ) alt ...