有没有一种很好的方法可以将RAW图像文件(尤其是Canon CR2和Adobe DNG文件)读取为GDI+位图,并且速度相当快?
我发现了一个在WPF下运行的例子,它可以使用任何安装的图像编解码器读取图像,然后在图像控件中显示它。我修改了这个例子,通过将WPF图像写入MemoryStream并从中创建位图来创建GDI+位图。但是这个过程很慢!速度慢得可怕!在我的电脑上打开一个简单的图像大约需要10秒钟。这个解决方案还需要引用WPF程序集,这感觉不太好,尤其是因为我想在ASP.NET项目中运行代码。
有些程序会对图像进行批量转换,但我更喜欢在请求时动态转换图像。
那么,有什么建议吗?
免责声明:我在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数据:
- 打开项目属性并将输出类型设置为类库
- 重新编译
- 在您自己的项目中添加对DLL的引用
- 在顶部添加
using dcraw;
-
声明以下代码行:
DcRawState state = new DcRawState(); state.inFilename = filename; state.ifp = new RawStream(filename); Identifier id = new Identifier(state); id.identify(state.ifp);
现在查看状态中的所有好东西(假设您的RAW文件受到支持并且没有引起异常;)