当前位置:首页 > Web开发 > 正文

索尼的.ARW、佳能的.CR2和.CR3和尼康的.NEF都在列——就可能就是为什么Windows 10可以直接打开相机的

2024-03-31 Web开发

标签:

再聊.NET解相机RAW格局照片

上次我发了一篇文章《用.NET解索尼相机ARW格局照片》,提到通过安置Sony Raw File Decoder的方法,然后挪用Windows Imaging Components来解析RAW格局文件。后来我颠末进一步研究、探索,发明还有更简单的步伐。

新的要领实在是太简单、好用了,对比之下,我前一篇文章的确就是在“挖坑”。

其实啥都不装,什么相机都撑持!

其实Windows 10自带了一个RAW格局解码器,也集成在Windows Imaging Components中,通过SharpDX.Direct2D1的几行代码,可以将这个解码器的信息调出来:

// 安置NuGet包:SharpDX.Direct2D1 using var wic = new ImagingFactory2(); using var decoder = new BitmapDecoder(wic, file, DecodeOptions.CacheOnDemand); string json = JsonSerializer.Serialize(decoder.DecoderInfo, new JsonSerializerOptions { WriteIndented = true }); Console.WriteLine(json);

运行功效如下(为突出重点,有少量删减):

{ "PixelFormats": [ "6fddc324-4e03-4bfe-b185-3d77768dc90d" ], "ColorManagementVersion": "1.0.0.0\u0000", "MimeTypes": "image/3FR,image/ARI,image/ARW,image/BAY,image/CAP,image/CR2,image/CR3,image/CRW,image/DCS,image/DCR,image/DRF,image/EIP,image/ERF,image/FFF,image/IIQ,image/K25,image/KDC,image/MEF,image/MOS,image/MRW,image/NEF,image/NRW,image/ORF,image/ORI,image/PEF,image/PTX,image/PXN,image/RAF,image/RAW,image/RW2,image/RWL,image/SR2,image/SRF,image/SRW,image/X3F,image/DNG\u0000", "FileExtensions": ".3FR,.ARI,.ARW,.BAY,.CAP,.CR2,.CR3,.CRW,.DCS,.DCR,.DRF,.EIP,.ERF,.FFF,.IIQ,.K25,.KDC,.MEF,.MOS,.MRW,.NEF,.NRW,.ORF,.ORI,.PEF,.PTX,.PXN,.RAF,.RAW,.RW2,.RWL,.SR2,.SRF,.SRW,.X3F,.DNG\u0000", "ContainerFormat": "fe99ce60-f19c-433c-a3ae-00acefa9ca21", "IsAnimationSupported": false, "IsChromakeySupported": false, "IsLosslessSupported": true, "IsMultiframeSupported": false, "Author": "Microsoft Corporation\u0000", "Version": "10.0.18362.1\u0000", "SpecVersion": "1.0.0.0\u0000", "FriendlyName": "Microsoft Raw Image Decoder\u0000", "ComponentType": 1, "CLSID": "41945702-8302-44a6-9445-ac98e8afa086", "SigningStatus": 1, "VendorGUID": "f0e749ca-edef-4589-a73a-ee0e626a2a2b", }

可见,什么都不用装,就已经撑持了高达36种RAW格局文件,索尼的.ARW、佳能的.CR2和.CR3和尼康的.NEF都在列——就可能就是为什么Windows 10可以直接打开相机的RAW格局文件。

使用上次文章中的同样代码,即可将.ARW格局文件转换为jpeg:

// 依赖于WPF,不用装NuGet包 var decoder = BitmapDecoder.Create(new Uri(@"DSC05458.ARW"), BitmapCreateOptions.None, BitmapCacheOption.Default); var transformedBitmap = new TransformedBitmap(decoder.Frames[0], Transform.Identity); var jpg = new JpegBitmapEncoder(); jpg.Frames.Add(BitmapFrame.Create(transformedBitmap)); using var stream = new MemoryStream(); jpg.Save(stream);

上次还挖了个坑说如果是我,一般会选择用SharpDX而不是WPF,但我又没说SharpDX的代码该怎么写,这里面我将SharpDX的代码贴出来(运行效果完全一样):

// 安置NuGet包:SharpDX.Direct2D1 using var wic = new ImagingFactory2(); using FormatConverter converter = LoadImage(wic, @"DSC00115.ARW"); Util.Image(SaveToJpeg(wic, converter)).Dump(); static byte[] SaveToJpeg(ImagingFactory2 wic, BitmapSource source) { using var ms = new MemoryStream(); using (var encoder = new JpegBitmapEncoder(wic, ms)) { using (var frame = new BitmapFrameEncode(encoder)) { frame.Options.ImageQuality = 0.7f; frame.Initialize(); frame.WriteSource(source); frame.Commit(); } encoder.Commit(); } return ms.ToArray(); } static FormatConverter LoadImage(ImagingFactory2 wic, string file) { using var decoder = new BitmapDecoder(wic, file, DecodeOptions.CacheOnDemand); decoder.Dump(); var converter = new FormatConverter(wic); converter.Initialize(decoder.GetFrame(0), PixelFormat.Format32bppPBGRA); return converter; }

代码中我插手了缩放,运行上次的.ARW文件后,可以得出一样的jpeg图片。

跨平台?没问题!

故名思义Windows Imaging Componnets,显然只有Windows上才华运行。想跨平台读取相机RAW格局文件就必需另找一个库——Magick.NET,其使用也非常简单,甚至比WIC更简单,只要两行代码!:

// 安置NuGet包:Magick.NET-Q8-AnyCPU using var image = new MagickImage(@"DSC00115.ARW"); byte[] bytes = image.ToByteArray(MagickFormat.Jpeg);

除了读取生存,Magick.NET还能缩放图片、转换pdf、加水印、读取Exif数据、无损压缩、绘图等成果,具体成果可以参见:https://github.com/dlemstra/Magick.NET/blob/master/docs/Readme.md。

此外,Magick.NET还撑持赶过200种图片格局,此中甚至还包孕Photoshop的psd文件。可以在这个链接中检察是否撑持你所需要的格局:https://imagemagick.org/index.php

……更别它还可以跨平台

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/33028.html