簡體   English   中英

在 .NET 中加載佳能 .CR2 文件

[英]Loading Canon .CR2 files in .NET

我正在嘗試使用 C# 處理 Canon RAW .CR2 文件。 我的代碼如下:

BitmapDecoder bmpDec = BitmapDecoder.Create(new Uri(origFile), BitmapCreateOptions.DelayCreation, BitmapCacheOption.None);
BitmapEncoder bmpEnc = new BmpBitmapEncoder();
bmpEnc.Frames.Add(bmpDec.Frames[0]);
Stream ms = new MemoryStream();
bmpEnc.Save(ms);
Image srcImage = Bitmap.FromStream(ms);

前幾行似乎順利運行,但該行

bmEnc.Save(ms);

只是掛起而沒有完成,也沒有引發任何異常。

有沒有人在這方面取得過任何成功?

申請https://www.microsoft.com/en-us/download/details.aspx?id=26829后的 W8.1 或 W7 似乎運行良好

var files = Directory.GetFiles(@"D:\DCIM","*.CR2");
            for(var i = 0; i < files.Length; i++) {
                Console.Write("{0,-4}: {1} => ", i, files[i]);
                var bmpDec = BitmapDecoder.Create(new Uri(files[i]), BitmapCreateOptions.DelayCreation, BitmapCacheOption.None);
                var bmpEnc = new JpegBitmapEncoder();
                bmpEnc.QualityLevel = 100;
                bmpEnc.Frames.Add(bmpDec.Frames[0]);
                var oldfn = Path.GetFileName(files[i]);
                var newfn = Path.ChangeExtension(oldfn, "JPG");
                using(var ms = File.Create(Path.Combine(@"D:\DCIM\100CANON", newfn), 10000000)) {
                    bmpEnc.Save(ms);
                }
                Console.WriteLine(newfn);
            }

知道這是一個舊線程,但我發現了一個很好的易於使用的庫(Magick.NET)。

如何進行轉換:

using (MagickImage image = new MagickImage("StillLife.CR2"))
{
    image.Write("StillLife.jpg");
}

https://github.com/dlemstra/Magick.NET/blob/master/docs/ReadRawImageFromCamera.md

nuget包安裝的詳細信息:

Install-Package Magick.NET-Q16-AnyCPU

https://github.com/dlemstra/Magick.NET

我不相信 BitmapDecoder 理解 .CR2。 到目前為止,它不是傳統的圖像格式,因為它包含原始拜耳傳感器圖像(每個像素一種顏色),而不是標准圖像。

如果你想轉換CR2等camera raw格式,你應該看看DCRaw: http ://www.cybercom.net/~dcoffin/dcraw/或者libraw(基於dcraw,友好的作為一個庫): http:// www.libraw.org/

NuGet 包: Magick.NET-Q16-AnyCPU

    private void ConvertToJpg(string path, string saveToFolder)
    {
        var filename = Path.GetFileName(path);

        ImageFormat format = ImageFormat.Jpeg;

        using (MagickImage magImg = new MagickImage(path))
        {
            magImg.Format = MagickFormat.Jpg;
            magImg.Quality = 99;
            magImg.Write($"{saveToFolder}\\{filename}.jpg");
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM