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

news/2025/2/21 4:19:16/

用.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.ppmy.cn/news/203814.html

相关文章

C#,索尼偏光相机(Polarization Camera)传感器IMX250和专用SDK简介

以下文字用百度翻译,效果一般,凑合看吧。 2018年12月开始上市的索尼偏光相机和偏光相机专用SDK实现了高功能、高画质、高速处理。其要点在于,开发为不在需要专业知识的偏振信号处理的安装中花费工时,能够以最小限度的成本利用的SD…

Adobe Photoshop支持的相机型号

Adobe Photoshop、Lightroom 和 Camera Raw 增效工具附带许多镜头配置文件,您可以利用这些配置文件修复常见的镜头像差问题,例如桶形几何变形和枕形几何变形。大多数镜头配置文件还能修复晕影,也就是图像的各个角比图像的其余部分颜色更暗问题…

【019】C++的指针与函数

C的指针与函数 引言一、指针变量作为函数的参数1.1、单向传递:值传递1.2、单向传递:传地址 二、数组作为函数的参数传递三、函数的返回值类型是指针类型四、函数指针4.1、函数指针的定义4.2、函数指针变量的注意事项4.3、函数指针变量使用typedef定义别名…

索尼经典机型回顾

VAIO PCG-505:唱响品牌开山之作(1997年) PCG-505虽不是第一款VAIO笔记本电脑产品,但它是真正令VAIO唱响品牌的经典作品,在一片黑色和灰白的塑料笔记本中,PCG-505大胆的采用了银紫色调的镁铝合金机壳&#x…

Basler相机全部型号详细参数

A102kc(C/F) 彩色, CCD, 1392x1040, C/F口, 28Mhz时钟, 8 or 10 or 12 bit or 24 bit RGB, 14.8fps A102f(C/F) 黑白, CCD, 13921040, C/F口, 8 or 12 bit, 15fps, IEEE 1394输出 Basler相机A102fc(C/F) 彩色, CCD, 13881038, C/F口, 8 or 12 bit or YUV422 or raw data, 15f…

相机型号

ELP-USBFHD01M-L180 http://www.elpcctv.com/full-hd-usb-camera-module-1080p-usb20-ov2710-color-sensor-support-mjpeg-with-36mm-lens-p-203.html ModelELP-USBFHD01M-L36SensorOV2710Sensor Size1/2.7 inchPixel Size3μm x 3μmimage area5856 μm x 3276 μmMax. Reso…

程序员必须了解的消息队列之王-Kafka

1. Kafka概述 1.1 定义 Kafka 是由 Apache 软件基金会开发的一个开源流处理平台。 Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。 1.2 消息队列 1.2.1 传统消息队列的应用场景 1.2.2 为什…

现代计算机体系结构发明人,cpu的发明人是谁啊?

查尔斯巴贝奇(Charles Babbage,1792—1871)设计了差分机和分析机 ,其设计理论非常超前,类似于百年后的电子计算机,特别是利用卡片输入程序和数据的设计被后人所采用。 1834年:他设想创建一个通用的分析器,将…