10

有没有一种将 RAW 图像文件(尤其是 Canon CR2 和 Adob​​e DNG 文件)作为 GDI+ 位图读取的好方法,而且速度相当快?

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

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

那么,有什么建议吗?

4

3 回答 3

6

免责声明:我在 Atalasoft 工作。

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

于 2008-10-22T21:55:15.577 回答
3

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

但是,我在这里找到了 Paint.NET 的 RAW 插件的代码,它很容易适应我的需求。该插件运行 DCRaw 可执行文件 ussign并从流中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/

于 2008-10-23T09:07:43.520 回答
3

这是 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 文件受支持并且没有导致异常;)

于 2010-11-23T14:06:43.267 回答