【问题标题】:Loading Canon .CR2 files in .NET在 .NET 中加载 Canon .CR2 文件
【发布时间】:2011-05-05 22:41:37
【问题描述】:

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

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

有人在这方面取得了成功吗?

【问题讨论】:

    标签: c# image-processing bitmap


    【解决方案1】:

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

    如果要转换CR2等camera raw格式,应该看DCRaw:http://www.cybercom.net/~dcoffin/dcraw/或者libraw(基于dcraw,作为库友好):http://www.libraw.org/

    【讨论】:

    • 好的,.NET 包装器现在已经写好了。如果我能做到防弹,我会把它贴在某个地方供公众使用。
    • 嗨@DarrenOster,您是否同时公开了包装器?
    • 是的@DarrenOster。你有吗?
    • 对不起,不,我从来没有考虑过。甚至不确定我正在进行的工作在哪里。如果我能找到它,我会把它扔到 GitHub 上,但没有承诺......
    【解决方案2】:

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

    【讨论】:

    • 使用 (var ms = File.Create(Path.Combine(@"D:\DCIM\100CANON", newfn), 10000000)) 。 . . .在“文件”字上出现错误:'Controller.File(byte[], string)' 是一种方法,在给定的上下文中无效
    • 好的,我必须添加“System.IO”。即使使用 System.IO 已经在页面顶部,在“文件”字样的前面。 “这样做的原因是因为您在控制器操作中编写此代码,该控制器操作已经在 Controller 类上定义了 File 方法。” stackoverflow.com/questions/16188314/…
    • Microsoft 的编解码器自 2014 年或 2015 年以来未更新。因此,它不支持较新的相机。可能需要从每个制造商(例如尼康)安装单独的编解码器,这不是那么理想
    【解决方案3】:

    知道这是一个旧线程,但我发现了一个很好用的库 (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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 2012-11-05
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      相关资源
      最近更新 更多