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

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

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

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

那么,有什么建议吗?

免责声明:我在Atalasoft工作。

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

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

但是,我在这里找到了Paint.NET的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/

这是一个dcraw的C#端口,虽然相当古老(v8.88),可以适应更新的佳能型号:
https://sourceforge.net/projects/dcrawnet/

编辑:
我只是在我自己的项目中使用它来从RAW文件中读取EXIF数据:

  1. 打开项目属性并将“ 输出类型”设置为“ 类库”
  2. 重新编译。
  3. 在您自己的项目中添加对DLL的引用。
  4. using dcraw;添加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文件受支持并且没有导致exception;)

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

谷歌在推出链接时不会推荐“imagemagck”。 甚至还有一个维基百科条目。

我希望这可以帮助别人。