用.NET解索尼相机ARW格式照片
用.NET解索尼相機(jī)ARW格式照片
目前常用的照片格式是?.jpg,它只能提供?8bit的色彩深度,而目前主流的相機(jī)都能提供高達(dá)?12bit-?14bit的色彩深度,動(dòng)態(tài)范圍和后期處理能力也大大增加,這也是為什么不少攝影愛(ài)好者會(huì)優(yōu)先使用相機(jī)提供原始格式,也就是?raw格式,它記錄了最多的信息。
但相機(jī)的?raw格式是廠商提供的,不像?jpg格式,廠商與廠商之間的格式不一樣,如索尼相機(jī)一般用?.ARW格式、佳能相機(jī)用?.CR2格式等等。正常讀?raw格式文件會(huì)用?Lightroom、?CaptureOne、?CameraRaw之類(lèi)的軟件。但如果拿著相機(jī)拍了不少漂亮相片,回家自己想來(lái)點(diǎn)“簡(jiǎn)單”騷操作,轉(zhuǎn)個(gè)碼,然后用自己搭的?NAS集成一下數(shù)據(jù)什么的,就需要用到最拿手的?C#了。
想象中讀?ARW格式的過(guò)程
代碼我也不太確定要怎么寫(xiě),也許……代碼就這樣?
using var bmp = Bitmap.FromFile(@"D:\A6000\2019-4-6\DSC05458.ARW");
不出所料果然讀不了,報(bào)錯(cuò)了,異常信息如下:
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
請(qǐng)注意,這里拋的是?OutOfMemoryException,看起來(lái)很奇怪——這里有必要說(shuō)一句,根據(jù)微軟官方提供的文檔(https://docs.microsoft.com/en-us/dotnet/api/system.drawing.image.fromfile?view=netframework-4.8),如果?GDI+不支持文件的像素格式,則就會(huì)拋?OutOfMemoryException。
探尋解決辦法
經(jīng)過(guò)一翻?Google和?Stackoverflow的探索,發(fā)現(xiàn)原來(lái)索尼官方提供了?ARW格式的解碼器,下載地址如下:http://ids.update.sony.net/microsoft/SRD20_Installer0810a.exe
下載后安裝即可,之后可以在注冊(cè)表中查看一下,注冊(cè)表位置如下是?計(jì)算機(jī)\HKEY_CLASSES_ROOT\CLSID\{7ED96837-96F0-4812-B211-F13C24117ED3}\Instance\{C17F7FAD-D98F-4B2A-8FF2-90E8A5CC0253},發(fā)現(xiàn)該組件確實(shí)安裝正確:?
安裝完之后再使用?GDI+的?API調(diào)用一下,發(fā)現(xiàn)仍然會(huì)報(bào)一樣的錯(cuò)。重啟一下還是一樣,調(diào)用?ImageCodecInfo.GetImageDecoders()就能發(fā)現(xiàn),其實(shí)在“內(nèi)置”的解碼器里面并沒(méi)有索尼?ARW文件:
*.BMP;*.DIB;*.RLE
*.JPG;*.JPEG;*.JPE;*.JFIF
*.GIF
*.EMF
*.WMF
*.TIF;*.TIFF
*.PNG
*.ICO
又經(jīng)過(guò)一翻搜尋,原來(lái),索尼提供的這個(gè)安裝包是集成于?WIC,也就是?WindowsImagingComponents,因?yàn)楸仨氁?WIC的?API,?SharpDX.Direct2D1和?WPF都是基于?WIC,按我的習(xí)慣肯定會(huì)用?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文件轉(zhuǎn)換為?JPG格式,注意代碼中有個(gè)?0.3,0.3,是為了顯示效果,我將?24M像素的原圖縮放了為?30%x30%,運(yùn)行效果如下:?
總結(jié)
事實(shí)上除了廠商提供的庫(kù),還有許多第三方機(jī)構(gòu)也提供解?raw格式的庫(kù),如?libraw等等。由于我?WIC用得比較熟悉,我就用?WIC來(lái)解了。
本文用到的索尼?ARW文件可以在我的百度網(wǎng)盤(pán)中下載:https://pan.baidu.com/s/1kTTpwMHIiprBK2hJGPajRw 提取碼:?8vpr。
喜歡的朋友 請(qǐng)關(guān)注我的微信公眾號(hào):【DotNet騷操作】
總結(jié)
以上是生活随笔為你收集整理的用.NET解索尼相机ARW格式照片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 程序员修神之路--打通Docker镜像发
- 下一篇: 依赖注入在 dotnet core 中实