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

用.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骚操作】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core on K8S深入学习(10)K8S包管理器Helm-Part 1

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。关于HelmWhy Helm?虽然K8S能够很好地组织和编排容器,但是缺少一个更高层次的应用打包工具,而Helm就是专门干这个事的。通过Helm能够…

520 钻石争霸赛 7-5 大勾股定理 (数学)

基本思路&#xff1a; 这道题暴力拿到14分并不难&#xff0c;根据题意模拟即可&#xff0c;具体代码在下面。 至于最后一个测试点超时的问题&#xff0c;现已解决&#xff0c;AC代码在第二部分哦~ 参考代码&#xff08;14分&#xff09;&#xff1a; #include<bits/stdc.h…

.NETer,如何用.NET Core 3.0武装自己?这样学效率提高10倍!

都2020了 你还不会.NET Core&#xff1f; 2019年&#xff0c;.NET Core 3.0横空出世&#xff0c;越来越多的开发者开始关注.NET Core&#xff0c;越来越多的互联网软件公司开始使用.NET Core&#xff0c;各大.NET招聘岗位要求中&#xff0c;也将.NET Core列为必备技能&#xff…

ASP.NET Core on K8S深入学习(10)K8S包管理器Helm-Part 2

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。上一篇 Part 1 中介绍了Helm的基本概念与基本使用&#xff0c;这一篇我们来自定义一个Chart玩玩。自定义一个Chart1 创建Chart首先&#xff0c;通过以下命令创建一个c…

使用Vistual Studio N年,推荐2个异常捕获的技巧

点击上方“dotNET全栈开发”&#xff0c;“设为星标”加“星标★”&#xff0c;每天11.50&#xff0c;好文必达全文约1600字&#xff0c;预计阅读时间3分钟这个n到底是多少年&#xff1f;宇宙第一开发IDE Visual Studio的调试功能非常强大&#xff0c;平常工作debug帮助我们解决…

LeetCode动态规划 斐波那契数

斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n > 1 给你 n &a…

Magicodes.Sms短信库的封装和集成

简介Magicodes.Sms是心莱团队封装的短信服务库&#xff0c;已提供Abp模块的封装。Nuget新的包开始使用如果使用Abp相关模块&#xff0c;则使用起来比较简单&#xff0c;具体您可以参考相关单元测试的编写。主要有以下步骤&#xff1a;1.引用对应的Nuget包如&#xff1a;2.添加模…

Magicodes.IE编写多框架版本支持和执行单元测试

背景很多情况下&#xff0c;我们编写了一些工具库之后&#xff0c;往往在某些框架版本中会出现一些问题&#xff0c;比如本人最近写的一个导入导出的工具库Magicodes.IE就出现了以下问题&#xff1a;&#xff08;GitHub&#xff1a;https://github.com/xin-lai/Magicodes.IE&am…

2019全球AI训练营五地再同发

不觉已过小大寒&#xff0c;虽然天气渐冷&#xff0c;但我们学习的热情却愈加高涨。因为由MVP发起主办的、2019年的全球AI训练营又要在北京、上海、广州、杭州、宁波五个地方同时举办了&#xff01;去年取得巨大成功的全球活动&#xff0c;今年参与举办的国家地区/城市更是高达…

NLog自定义Layout Renderer

更多精彩内容请关注我们长话短说前文《解剖HttpClientFactory&#xff0c;自由扩展HttpMessageHandler》主要讲如何为HttpClientFactory自定义HttpMessageHandler组件, 现在完成课后的小作业&#xff1a; 将重点日志字段显示到Nlog的Layout Renderer上本文自定义一个NLog Layo…

一文了解Nuget的使用

Nuget介绍官网定义&#xff1a;NuGet是.NET的软件包管理器&#xff08;免费&#xff09;。NuGet客户端工具提供了生成和使用软件包的能力。NuGet Gallery 是所有软件包作者和消费者都使用的中央软件包存储库。简单来说&#xff0c;nuget包解决了dll引用的问题&#xff0c;开发者…

.NET 应用程序支持直接调用 WebAssembly 模块

WebAssembly Runtime 现已添加 .NET Core API&#xff0c;开发者可直接在 .NET 应用程序中调用 WebAssembly 模块。Mozilla 宣布由 Bytecode Alliance 创建的 Wasmtime&#xff08;WebAssembly runtime&#xff09;现已添加处于早期预览版状态的 .NET Core API&#xff0c;这就…

《RPA、AI、.NET Core 与未来》-中国.NET开发者峰会

未 来第四次工业革命&#xff0c;催生了数字自动化劳动&#xff0c;RPA 与 AI 技术的融合&#xff0c;成为智能信息社会的重要环节。当下RPA平台主要采用.NET Framework框架&#xff0c;也限制了 RPA 只用于 Windows 平台。.NET Core 的开放与跨平台特性赋予RPA更大发展空间。…

浅议gRPC的数据传输机制和回调机制

本文来自DotNET技术圈作者&#xff1a;溪源一、引子如您所知&#xff0c;gRPC是目前比较常见的rpc框架&#xff0c;可以方便的作为服务与服务之间的通信基础设施&#xff0c;为构建微服务体系提供非常强有力的支持。而基于.NET Core的gRPC.NET 组件截至2019年11月30日的最新版本…

如何在 Visual Studio 2019 中连接中国版 Azure

点击上方蓝字关注“汪宇杰博客”导语做国内项目很可能用到中国版的 Azure&#xff0c;即世纪互联运营的 azure.cn。然而 Visual Studio 2019 默认连接的是国际版的 Azure&#xff0c;如何添加中国版订阅呢&#xff1f;差点9966年前我曾经写过一篇《图解&#xff1a;如何在Visua…

k8s 使用 Init Container 确保依赖的服务已经启动

k8s 使用 Init Container 确保依赖的服务已经启动Intro最近 helm 3 正式发布了&#xff0c;dotnetcore 3.1 也正式发布了&#xff0c;最近打算把我的活动室预约项目做一个升级&#xff0c;项目已经升级到了 dotnetcore 3.1&#xff0c;最近几天则在准备把项目打包一个 helm 包&…

dotNET面试题汇总系列连载(1):基础语法

点击上方“dotNET全栈开发”&#xff0c;“设为星标”加“星标★”&#xff0c;每天11.50&#xff0c;好文必达全文约4000字&#xff0c;预计阅读时间8分钟马上要到2020年了&#xff0c;这里整理一个.NET 工程师面试题系列&#xff0c;希望年底或者明年金三银四跳槽的程序猿们带…

Blazor 版 Bootstrap Admin 通用后台权限管理框架

前言上一篇介绍过了前后台分离的 NET Core 通用权限管理系统 在这篇文章简要的介绍了 Bootstrap Admin 后台管理框架的一些功能。本篇文章带来的是微软最新出的 Blazor 版本的 NET Core 通用权限管理系统Blazor 简介至于 Blazor 是什么&#xff0c;Blazor 的优缺点小伙伴们可以…

xms跨平台基础框架 - 基于.netcore

背景鄙人经过多年开发&#xff0c;数百个项目“打磨(折磨)”&#xff0c;各种国内外框架平台都有涉及&#xff0c;没有一款称心顺手的&#xff0c;原因有三&#xff0c;一是设计反人类&#xff0c;二是不开源根本无法突破框架限制&#xff0c;三是即使开源也是阉割版&#xff0…

如何让 Azure AD 里的应用只允许特定用户登录

点击上方蓝字关注“汪宇杰博客”导语我的博客系统支持 Azure Active Directory 身份认证&#xff0c;然而用VS点点鼠标配出来的 Azure 应用&#xff0c;默认情况下会允许所有 AAD 内的用户访问&#xff0c;如何限制为只让特定用户访问呢&#xff1f;背景情况其实最近&#xff0…