正在将RAW图像文件读取为GDI+位图

本文关键字:读取 GDI+ 位图 文件 图像 RAW | 更新日期: 2023-09-27 17:48:52

有没有一种很好的方法可以将RAW图像文件(尤其是Canon CR2和Adobe DNG文件)读取为GDI+位图,并且速度相当快?

我发现了一个在WPF下运行的例子,它可以使用任何安装的图像编解码器读取图像,然后在图像控件中显示它。我修改了这个例子,通过将WPF图像写入MemoryStream并从中创建位图来创建GDI+位图。但是这个过程很慢!速度慢得可怕!在我的电脑上打开一个简单的图像大约需要10秒钟。这个解决方案还需要引用WPF程序集,这感觉不太好,尤其是因为我想在ASP.NET项目中运行代码。

有些程序会对图像进行批量转换,但我更喜欢在请求时动态转换图像。

那么,有什么建议吗?

正在将RAW图像文件读取为GDI+位图

免责声明:我在Atalasoft工作。

我们的DotImage Photo Pro产品可以做到这一点。如果你想自己尝试,可以考虑包装开源DCRaw,或者看看Paint.NET是如何做到的(我认为有一个RAW插件)

DotImage Photo Pro组件运行良好,但我在使用它从原始文件中提取预览图像时遇到了问题。这也超出了我对该项目的预算。

但是,我在这里找到了Paint.NET的RAW插件的代码,它很容易适应我的需求。该插件运行DCRaw可执行文件usingn Process.Start,并从StandardOutput流中读取其输出。非常简单快捷!:-)

编辑:

插件的链接已经不起作用了,但这是我用来提取图像的代码。以下代码提取存储在原始文件中的jpg预览。如果你想要完整的图像,你应该删除-e参数。但是要注意,对于某些相机,你会得到GDI+无法读取的ppm图像。

public Stream GetImageData(string inputFile, string dcRawExe)
{

    var startInfo = new ProcessStartInfo(dcRawExe)
    {
        Arguments = "-c -e '"" + inputFile + "'"",
        RedirectStandardOutput = true,
        UseShellExecute = false
    };
    var process = Process.Start(startInfo);
    var image = Image.FromStream(process.StandardOutput.BaseStream);
    var memoryStream = new MemoryStream();
    image.Save(memoryStream, ImageFormat.Png);
    return memoryStream;
}

此外,您还需要一份DCRaw。我使用了此网站的DcrawMS.exe:http://www.insflug.org/raw/Downloads/

这里有一个dcraw的C#端口,虽然相当旧(v8.88),但可以调整为包括较新的佳能型号:
https://sourceforge.net/projects/dcrawnet/

编辑:
我刚刚在我自己的项目中使用了它,用于从RAW文件中读取EXIF数据:

  1. 打开项目属性并将输出类型设置为类库
  2. 重新编译
  3. 在您自己的项目中添加对DLL的引用
  4. 在顶部添加using dcraw;
  5. 声明以下代码行:

    DcRawState state = new DcRawState();
    state.inFilename = filename;
    state.ifp = new RawStream(filename);
    
    Identifier id = new Identifier(state);
    id.identify(state.ifp);
    

现在查看状态中的所有好东西(假设您的RAW文件受到支持并且没有引起异常;)