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

10

有没有一种较快的方式可以读取RAW图像文件(特别是Canon CR2和Adobe DNG文件)并作为GDI+位图呈现?

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

有些程序能够批处理转换图像,但我更喜欢在请求时动态转换图像。

那么,有什么建议吗?

3个回答

6
免责声明:我在Atalasoft工作。
我们的DotImage Photo Pro产品可以做到这一点。如果您想尝试自己做,请查看如何包装开源DCRaw或查看Paint.NET如何处理它(我认为有一个原始插件可用)。

2
DCraw:http://www.cybercom.net/~dcoffin/dcraw/ - Jared Updike

3
这是一个C#版本的dcraw,虽然比较旧(v8.88),但可以用于适应新的佳能模型:
https://sourceforge.net/projects/dcrawnet/ 编辑:
我刚刚在我的项目中成功使用它读取RAW文件的EXIF数据。
  1. Open project properties and set Output Type to Class Library.
  2. Recompile.
  3. Add a reference to the DLL in your own project.
  4. Add using dcraw; at the top.
  5. Declare these lines of code:

    DcRawState state = new DcRawState();
    state.inFilename = filename;
    state.ifp = new RawStream(filename);
    
    
    Identifier id = new Identifier(state);
    id.identify(state.ifp);
    

现在检查一下状态中的所有好东西(假设您的RAW文件得到支持并且没有引发异常;)


3
DotImage Photo Pro组件运行良好,但我在使用它提取raw文件的预览图像时遇到了问题。而且这个组件超出了我的预算。但是,我在Paint.NET的这里找到了一个RAW插件的代码,并且很容易地适应了我的需求。该插件使用Process.Start运行DCRaw可执行文件,并从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的拷贝。我使用了来自http://www.insflug.org/raw/Downloads/这个网站的DcrawMS.exe。


1
这个能读取EXIF数据吗? - Rowland Shaw
不过,还有其他的命令行工具可以提取exif信息。尝试谷歌搜索“dcraw exif”。 - Rune Grimstad
你提供的网站已经崩溃了。能否在这里发布代码以帮助其他寻求者呢? :) - glenneroo
2
http://www.centrostudiprogressofotografico.it/zh/dcraw/ 新链接 - Stoopkid
对于 Windows 窗体应用程序,我们是否可以直接返回 Image.FromStream...(而不是复制到 MemoryStream)? - S.Serpooshan
不,我不这么认为。我们使用MemoryStream来获取图像的副本,以便在其他地方使用。 - Rune Grimstad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接