在.NET中加载Canon .CR2文件

时间:2010-11-06 04:44:29

标签: c# image-processing bitmap

我正在尝试使用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);

只是挂起而没有完成,也没有引发任何异常。

有没有人有过这方面的成功?

4 个答案:

答案 0 :(得分:4)

应用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);
            }

答案 1 :(得分:2)

知道这是一个老线程,但我发现一个很好用的(Magick.NET)

如何进行转化

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

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

nuget包安装的详细信息

安装包Magick.NET-Q16-AnyCPU

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

答案 2 :(得分:0)

我不相信BitmapDecoder能理解.CR2。到目前为止,它不是传统的图像格式,因为它包含原始的拜耳传感器图像(每个像素一种颜色),而不是标准图像。

如果你想转换CR2和其他相机原始格式,你应该看看DCRaw:http://www.cybercom.net/~dcoffin/dcraw/或libraw(基于dcraw,友好的库):http://www.libraw.org/

答案 3 :(得分:0)

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");
        }
    }