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


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

目前常用的照片格式是.jpg,它只能提供8bit的色彩深度,而目前主流的相機都能提供高達12bit-14bit的色彩深度,動態范圍和后期處理能力也大大增加,這也是為什么不少攝影愛好者會優先使用相機提供原始格式,也就是raw格式,它記錄了最多的信息。

但相機的raw格式是廠商提供的,不像jpg格式,廠商與廠商之間的格式不一樣,如索尼相機一般用.ARW格式、佳能相機用.CR2格式等等。正常讀raw格式文件會用LightroomCapture OneCamera 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

探尋解決辦法

經過一翻GoogleStackoverflow的探索,發現原來索尼官方提供了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,因為必須要用WICAPISharpDX.Direct2D1WPF都是基於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騷操作】

DotNet騷操作


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM