是否有一种很好的方法可以将RAW图像文件(尤其是Canon CR2和Adobe DNG文件)作为GDI +位图读取速度相当快?
我找到了一个在WPF下运行的示例,该示例将使用任何已安装的图像编解码器读取图像,然后将其显示在图像控件中。我修改了这个例子,通过将WPF图像写入MemoryStream并从中创建Bitmap来创建GDI +位图。但这个过程很慢!非常慢!在我的电脑上打开一张简单的图像需要大约10秒钟。此解决方案还需要对WPF程序集的引用,这感觉不对,特别是因为我想在ASP.NET项目中运行代码。
有些程序可以对图像进行批量转换,但我更愿意在请求时动态转换图像。
那么,有什么建议吗?
答案 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数据:
using dcraw;
。声明这些代码行:
DcRawState state = new DcRawState();
state.inFilename = filename;
state.ifp = new RawStream(filename);
Identifier id = new Identifier(state);
id.identify(state.ifp);
现在查看状态内的所有好东西(假设您的RAW文件受支持并且没有导致异常;)
答案 3 :(得分:0)
哇。刚为我的.NET MVC项目偶然发现了这个问题。可以做RAW,加上你梦寐以求的世界上的任何东西。包括代码,示例和许多不同的编程语言选择。 它看起来很好我觉得在使用它之前就捐了一些钱。
Google建议使用“imagemagck”,因为不建议使用链接。甚至还有一个维基百科条目。
我希望这有助于某人。