.NET解所有相机RAW格式照片
再聊.NET解相机RAW格式照片
上次我发了一篇文章《用.NET解索尼相机ARW格式照片》,提到通过安装Sony Raw File Decoder
的方式,然后调用Windows Imaging Components
来解析RAW
格式文件。后来我经过进一步研究、探索,发现还有更简单的办法。
新的方法实在是太简单、好用了,相比之下,我前一篇文章简直就是在“挖坑”。
其实啥都不装,什么相机都支持!
其实Windows 10
自带了一个RAW
格式解码器,也集成在Windows Imaging Components
中,通过SharpDX.Direct2D1
的几行代码,可以将这个解码器的信息调出来:
// 安装NuGet包:SharpDX.Direct2D1
using var wic = new ImagingFactory2();
using var decoder = new BitmapDecoder(wic, file, DecodeOptions.CacheOnDemand);
string json = JsonSerializer.Serialize(decoder.DecoderInfo, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(json);
运行结果如下(为突出重点,有少量删减):
{
"PixelFormats": [
"6fddc324-4e03-4bfe-b185-3d77768dc90d"
],
"ColorManagementVersion": "1.0.0.0\u0000",
"MimeTypes": "image/3FR,image/ARI,image/ARW,image/BAY,image/CAP,image/CR2,image/CR3,image/CRW,image/DCS,image/DCR,image/DRF,image/EIP,image/ERF,image/FFF,image/IIQ,image/K25,image/KDC,image/MEF,image/MOS,image/MRW,image/NEF,image/NRW,image/ORF,image/ORI,image/PEF,image/PTX,image/PXN,image/RAF,image/RAW,image/RW2,image/RWL,image/SR2,image/SRF,image/SRW,image/X3F,image/DNG\u0000",
"FileExtensions": ".3FR,.ARI,.ARW,.BAY,.CAP,.CR2,.CR3,.CRW,.DCS,.DCR,.DRF,.EIP,.ERF,.FFF,.IIQ,.K25,.KDC,.MEF,.MOS,.MRW,.NEF,.NRW,.ORF,.ORI,.PEF,.PTX,.PXN,.RAF,.RAW,.RW2,.RWL,.SR2,.SRF,.SRW,.X3F,.DNG\u0000",
"ContainerFormat": "fe99ce60-f19c-433c-a3ae-00acefa9ca21",
"IsAnimationSupported": false,
"IsChromakeySupported": false,
"IsLosslessSupported": true,
"IsMultiframeSupported": false,
"Author": "Microsoft Corporation\u0000",
"Version": "10.0.18362.1\u0000",
"SpecVersion": "1.0.0.0\u0000",
"FriendlyName": "Microsoft Raw Image Decoder\u0000",
"ComponentType": 1,
"CLSID": "41945702-8302-44a6-9445-ac98e8afa086",
"SigningStatus": 1,
"VendorGUID": "f0e749ca-edef-4589-a73a-ee0e626a2a2b",
}
可见,什么都不用装,就已经支持了高达36
种RAW
格式文件,索尼的.ARW
、佳能的.CR2
和.CR3
和尼康的.NEF
都在列——就可能就是为什么Windows 10
可以直接打开相机的RAW
格式文件。
使用上次文章中的同样代码,即可将.ARW
格式文件转换为jpeg
:
// 依赖于WPF,不用装NuGet包
var decoder = BitmapDecoder.Create(new Uri(@"DSC05458.ARW"), BitmapCreateOptions.None, BitmapCacheOption.Default);
var transformedBitmap = new TransformedBitmap(decoder.Frames[0], Transform.Identity);
var jpg = new JpegBitmapEncoder();
jpg.Frames.Add(BitmapFrame.Create(transformedBitmap));
using var stream = new MemoryStream();
jpg.Save(stream);
上次还挖了个坑说如果是我,一般会选择用SharpDX
而不是WPF
,但我又没说SharpDX
的代码该怎么写,这里面我将SharpDX
的代码贴出来(运行效果完全一样):
// 安装NuGet包:SharpDX.Direct2D1
using var wic = new ImagingFactory2();
using FormatConverter converter = LoadImage(wic, @"DSC00115.ARW");
Util.Image(SaveToJpeg(wic, converter)).Dump();
static byte[] SaveToJpeg(ImagingFactory2 wic, BitmapSource source)
{
using var ms = new MemoryStream();
using (var encoder = new JpegBitmapEncoder(wic, ms))
{
using (var frame = new BitmapFrameEncode(encoder))
{
frame.Options.ImageQuality = 0.7f;
frame.Initialize();
frame.WriteSource(source);
frame.Commit();
}
encoder.Commit();
}
return ms.ToArray();
}
static FormatConverter LoadImage(ImagingFactory2 wic, string file)
{
using var decoder = new BitmapDecoder(wic, file, DecodeOptions.CacheOnDemand);
decoder.Dump();
var converter = new FormatConverter(wic);
converter.Initialize(decoder.GetFrame(0), PixelFormat.Format32bppPBGRA);
return converter;
}
代码中我加入了缩放,运行上次的.ARW
文件后,可以得出一样的jpeg
图片。
跨平台?没问题!
故名思义Windows Imaging Componnets
,显然只有Windows
上才能运行。想跨平台读取相机RAW
格式文件就必须另找一个库——Magick.NET
,其使用也非常简单,甚至比WIC
更简单,只要两行代码!:
// 安装NuGet包:Magick.NET-Q8-AnyCPU
using var image = new MagickImage(@"DSC00115.ARW");
byte[] bytes = image.ToByteArray(MagickFormat.Jpeg);
除了读取保存,Magick.NET
还能缩放图片、转换pdf
、加水印、读取Exif
数据、无损压缩、绘图等功能,具体功能可以参见:https://github.com/dlemstra/Magick.NET/blob/master/docs/Readme.md。
另外,Magick.NET
还支持超过200
种图片格式,其中甚至还包括Photoshop
的psd
文件。可以在这个链接中查看是否支持你所需要的格式:https://imagemagick.org/index.php
……更别它还可以跨平台。
有一点需要注意,它的NuGet
包有许多个,初一看可能会一惊:
这里可以说一下,首先它有Q8
、Q16
和Q16-HDRI
三种版本:
Q8
表示一个像素使用8
位颜色深度,它占用内存最小;Q16
表示一个像素使用16
位颜色深度,比Q8
多一倍;Q16-HDRI
则使用32
位浮点型来表示颜色,比Q16
再多一倍;
正常使用建议Q8
即可,有微单/单反修图需求的,可以考虑Q16
/Q16-HDRI
。
另外它还有x86
、x64
和AnyCPU
三个平台版本,一般选AnyCPU
,但注意Magick.NET
是基于本地代码,因此它需要下载多个平台,因此AnyCPU
大小(45.34MB
)比x64
(20.85MB
)大一倍。
缺点?
有这么多优点,还要什么自行车?……其实它也是有缺点的,有个明显的缺点,就是性能慢。我测试了上次那张ARW
格式文件,性能分析如下(平均需要3.7
秒):
次数 | 分配内存 | 内存提高 | 耗时 |
---|---|---|---|
1 | 43,918,792 | 1,080 | 3739 |
2 | 43,884,944 | 160 | 3748 |
3 | 43,966,000 | 664 | 3878 |
4 | 44,015,928 | 80 | 3778 |
5 | 43,902,784 | 416 | 3747 |
换成WIC
,性能数据如下,耗时只要705毫秒
,明显快得多:
次数 | 分配内存 | 内存提高 | 耗时 |
---|---|---|---|
1 | 11,939,072 | 1,488 | 713 |
2 | 11,939,768 | 10,256 | 709 |
3 | 12,013,872 | 4,608 | 705 |
4 | 11,931,664 | 96 | 705 |
5 | 11,919,384 | -25,968 | 704 |
总结
如果你用Windows 10
,则什么都不用装,就能体验到极致性能的RAW
解析工具,因为系统自带了Microsoft Raw Image Decoder
。
如果你想跨平台(但不特别在意性能),则可以使用开源的Magick.NET
,它提供最便利的API
和最省心的功能、格式支持,特别强大。但话又说回来,RAW
这种东西一般都是骚操作才需要,谁在意跨平台呢?
我也特意试了一下收费的Aspose.Imaging
,但解析RAW
格式文件不是它的长项,直接不支持。
本想研究一下libraw
,但它只提供了C API
——也不是不能用。正准备用P/Invoke
时刚正面就有了本文中的发现。
喜欢的朋友 请关注我的微信公众号:【DotNet骚操作】
.NET解所有相机RAW格式照片的更多相关文章
- 用.NET解索尼相机ARW格式照片
用.NET解索尼相机ARW格式照片 目前常用的照片格式是.jpg,它只能提供8bit的色彩深度,而目前主流的相机都能提供高达12bit-14bit的色彩深度,动态范围和后期处理能力也大大增加,这也是为 ...
- 艰苦的RAW格式数据恢复之旅
艰苦的RAW格式数据恢复之旅 1.RAW 格式形成原因 2.RAW 格式的解决的方法 经验之谈: 1.RAW 格式形成原因 关于形成的原因,在网上搜索了下,千奇百怪的都有,就不一一诉说了,可是有果必有 ...
- 【Python】使用Python处理RAW格式图片,并根据实际情况完成分组打包发送
背景 出游之后,朋友交换的照片格式大多是RAW格式,一些人想要JPG格式,但是百度云盘非会员的下载速度惨不忍睹,所以我想着通过微信群直接传(这个在事后也被证实不能完全解决问题,微信限制了每天传递文件的 ...
- 【ThermoRawFileParser】质谱raw格式转换mgf
众所周知,Proteowizard MSconvert用于质谱原始数据的格式转换,但主要平台是windows,要想在Linux上运行需要打Docker或Wine,对于普通用户来说还是很困难的,想想质谱 ...
- raw格式镜像文件压缩并转换为qcow2格式
raw格式文件,这个比较占用空间,你可以用以下命令将其压缩并转换成qcow2格式. # virt-sparsify --compress --convert qcow2 ubuntu.img ubun ...
- Log4j使用详解(log4j.properties格式)
Log4j使用详解(log4j.properties格式) 1.Log4j 的引入 在应用程序中添加日志记录总的来说基于三个目的: ① 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计 ...
- RAW格式
一.什么是RAW文件?RAW文件主要是一种记录了数码相机传感器的原始信息,同时伴随着一些由相机所产生的一些元数据(metadata,诸如IS0的设置.快门速度.光圈值.白平衡等)的文件.不同的相机制造 ...
- 如何打开iPhone 中的heic格式照片
苹果手机拍出来的heic照片相比常见的格式占存更小,但是在安卓和电脑上这种格式无法直接查看,那怎么在电脑上查看呢,需要将其转换格式就可以查看,关于如何打开iPhone 中的heic格式照片,下面即将为 ...
- Ubuntu下预览raw格式图片
默认Ubuntu下资源管理器是不可以直接预览raw格式图片的,这就给查看图片带来很大的不便,下面我们就选择安装UFRaw来预览Raw格式图片 1. 首先在terminal安装UFRaw sudo ap ...
随机推荐
- JS全选按钮练习
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- AE开发常见问题总结
一. Arcgis10.0 组件初始化失败解决方法: ESRI.ArcGIS.RuntimeManager.BindLicense(ESRI.ArcGIS.ProductCode.EngineOrDe ...
- Python入门4 —— 输入与输出
一:输入(Input) 1.python3中的input(输入) inp_username=input("请输入您的密码:") # "18" print(inp ...
- Java的三种循环:1、for循环 2、while循环 3、do...while循环
Java的三种循环 Java三种循环结构: 1.for循环 2.while循环 3.do...while循环 循环结构组成部分:1.条件初始化语句,2.条件判断语句 , 3.循环体语句,4.条件控制语 ...
- Java 面向对象编程 抽象类 抽象方法 abstract
抽象类 通过abstract定义的方法是抽象方法,它只有定义,没有实现.抽象方法定义了子类必须实现的接口规范: 定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法: 如果 ...
- 12c的PDB创建DIRECTORY要注意与PATH_PREFIX的关系(ORA-65254)
在创建PDB过程中如果使用了带PATH_PREFIX的参数,意味着在创建DIRECTORY目录时需要指定相对路径,而不能指定其它绝对路径.来自博客园AskScuti 11g整库作为一个PDB迁移至阿里 ...
- WPF学习笔记二之依赖属性
1.快捷生成依赖属性:propdp然后按两次tab键 2.应用场景:自定义控件 什么是依赖属性:依赖属性自己没有值,通过依赖别人(如Binding)来获得值. 依赖属性为什么会出现:控件常用字段有限, ...
- codeforces 1288C. Two Arrays(dp)
链接:https://codeforces.com/contest/1288/problem/C C. Two Arrays 题意:给定一个数n和一个数m,让构建两个数组a和b满足条件,1.数组中所有 ...
- 关于pip命令的几点提醒
pip install xxxxx 总会遇到安装失败,或者下载速度很慢的情况.这是因为从国外安装资源包,造成速度慢,那有咩有国内的源呢,有的. 国内源: 清华:https://pypi.tuna.ts ...
- css和js处理隔行换色的问题
<html> <head> <meta charset="utf-8"> <meta name="" conten ...