如何在WPF

时间:2016-05-27 10:56:04

标签: c# wpf image background

我编写了一个简单的应用程序,它滚动文件夹并显示该文件夹中的照片,用户可以查看该文件,并选择要对照片执行的多个操作,然后再单击下一个。该应用程序工作正常,当使用甚至大型Jpegs(15-19 MB)时,它可以非常快速地滚动。 (图像之间没有延迟)但是当涉及到RAW文件(20 - 25 MB)时,用户点击下一个图像需要3-4秒才能加载下一个图像。

到目前为止,我已经尝试了几个选项,例如设置BitmapImage.bi.DecodePixelHeight = 1080(对于JPegs非常有效,但是改变原始文件的颜色等因此无法使用) 我已经尝试使用后台工作程序将队列中的下一个文件加载到内存中,如果用户花费足够的时间查看当前图像但是如果快速滚动图像则会出现错误“BackgroundWorker当前正忙” ”。 我知道它可以完成,因为Windows 10应用程序“照片”可以快速滚动NEF文件,我想要一些关于我应该如何完成与此相同的速度的建议。

有没有更好的方法在后台加载图像,有没有办法可以压缩原始文件,以便在加载它们之前以1920 * 1080显示它们(目前它们是6000 * 4000)或任何其他想法将是非常有帮助

1 个答案:

答案 0 :(得分:4)

您可以尝试从该原始文件中提取嵌入的jpeg图像。大多数(甚至可能是所有)相机都包含RAW内部的全尺寸jpeg,这应该适合您的预览。我使用了dcraw工具(here是docs)。要从.NET代码中调用它,只需通过Process.Start

调用它
private void ExtractJpegFromRaw(string raw, string outputPath) {
    if (!File.Exists(raw)) return;
    var dcraw = Path.Combine("path to dcraw.exe here");
    var command = String.Format("\"{0}\" -e -c -t 0 \"{1}\" > \"{2}\"", dcraw, raw, outputPath);
    var p = new Process();
    p.StartInfo = new ProcessStartInfo("cmd", String.Format("/c \"{0}\"", command));
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.CreateNoWindow = true;
    p.Start();
    p.WaitForExit();    
}

我必须说我没有测量它的性能,但是提取现有的jpeg应该很快。所以你可以做的就是运行这段代码,然后显示生成的jpeg,另外你可以缓存那个预览,下次用户将查看相同的原始 - 你将准备jpeg(这是大多数照片查看器工具所做的 - 它们缓存预览)