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

时间:2008-10-22 21:24:22

标签: c# asp.net .net gdi+ dng

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

我找到了一个在WPF下运行的示例,该示例将使用任何已安装的图像编解码器读取图像,然后将其显示在图像控件中。我修改了这个例子,通过将WPF图像写入MemoryStream并从中创建Bitmap来创建GDI +位图。但这个过程很慢!非常慢!在我的电脑上打开一张简单的图像需要大约10秒钟。此解决方案还需要对WPF程序集的引用,这感觉不对,特别是因为我想在ASP.NET项目中运行代码。

有些程序可以对图像进行批量转换,但我更愿意在请求时动态转换图像。

那么,有什么建议吗?

4 个答案:

答案 0 :(得分:6)

免责声明:我在Atalasoft工作。

我们的DotImage Photo Pro产品可以做到这一点。如果您想尝试自己动手,请查看包装opensource DCRaw或查看Paint.NET是如何做到的(我认为它有一个RAW插件)

答案 1 :(得分:3)

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

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

编辑:

插件的链接不再起作用,但这是我用来提取图像的代码。以下代码提取存储在原始文件中的jpg-preview。如果你想要完整的图像,你应该删除-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/

答案 2 :(得分:2)

以下是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);
    
  6. 现在查看状态内的所有好东西(假设您的RAW文件受支持并且没有导致异常;)

答案 3 :(得分:0)

哇。刚为我的.NET MVC项目偶然发现了这个问题。可以做RAW,加上你梦寐以求的世界上的任何东西。包括代码,示例和许多不同的编程语言选择。 它看起来很好我觉得在使用它之前就捐了一些钱。

Google建议使用“imagemagck”,因为不建议使用链接。甚至还有一个维基百科条目。

我希望这有助于某人。