天天看點

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

但相機的`raw`格式是廠商提供的,不像`jpg`格式,廠商與廠商之間的格式不一樣,如索尼相機一般用`.ARW`格式、佳能相機用`.CR2`格式等等。正常讀`raw`格式檔案會用`Lightroom`、`Capture One`、`Camera Raw`之類的軟體。但如果拿着相機拍了不少漂亮相片,回家自己想來點“簡單”騷操作,轉個碼,然後用自己搭的`NAS`內建一下資料什麼的,就需要用到最拿手的`C#`了。

用.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

***

的探索,發現原來索尼官方提供了

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}

,發現該元件确實安裝正确:

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

安裝完之後再使用

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%

,運作效果如下:

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

總結

事實上除了廠商提供的庫,還有許多第三方機構也提供解

raw

格式的庫,如

libraw

等等。由于我

WIC

用得比較熟悉,我就用

WIC

來解了。

本文用到的索尼

ARW

檔案可以在我的百度網盤中下載下傳:https://pan.baidu.com/s/1kTTpwMHIiprBK2hJGPajRw 提取碼:

8vpr

喜歡的朋友 請關注我的微信公衆号:【DotNet騷操作】