我如何在wpf桌面应用程序的后台加载照片,使它不会花几秒钟加载下一张照片在图库

本文关键字:加载 几秒 钟加载 一张照片 桌面 应用程序 wpf 后台 照片 | 更新日期: 2023-09-27 18:13:57

目前,我的程序从xml文件中读取记录中的图像和文本,将它们显示在屏幕上,然后单击上一个/下一个按钮移动到下一个记录。然而,每张照片之间似乎需要几秒钟的加载时间,我希望它是即时的,就像Windows photo Gallery一样……或Facebook照片(记住这不是一个web应用程序)。

我搜索了一些与我相似的情况,但似乎没有一个适合我的情况。我试着做一个类,根据我的搜索,处理后台加载,并在我的程序中调用它,但它充满了错误,甚至可能不会做我想做的事情:

//ImageManager.cs
class ImageManager
{
    private Dictionary<string, Image> images = new Dictionary<string, Image>();
    public Image get(string s)
    {  // blocking call, returns the image
        return load(s);
    }
    private Image load(string s)
    {  // internal, thread-safe helper
        lock (images)
        {
            if (!images.ContainsKey(s))
            {
                Image img = images.Add(s, img); //load the image s - ERROR cannot implicitly convert type void to image. Void??
                return img;
            }
            return images[s];
        }
    }
    public void preload(params string[] imgs)
    {  // non-blocking preloading call
        foreach (string img in imgs)
        {
            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += (s, e) => { load(img); };  // discard the actual image return
            bw.RunWorkerAsync();
        }
    }
}

//MainWindow.cs
ImageManager im = new ImageManager();
im.preload("Data/Images"); // Errors - im is a field but used like a type/token '('

提前致谢

我如何在wpf桌面应用程序的后台加载照片,使它不会花几秒钟加载下一张照片在图库

您的ImageManager应该与ImageSource s一起工作,而不是Image s。即使您使当前的代码正常工作,您也会发现您的UI仍然挂起,因为您别无选择,只能在UI线程上执行工作。如果你转而处理ImageSource s,你可以在后台线程中加载它们,然后冻结它们,以便从UI线程中使用它们。这使您可以预先加载图像,或者在加载时显示加载动画。

BitmapFrame.Create可能是您想要使用的方法来加载图像

考虑缓存按比例缩小的图像——按您想要显示的比例的1:1,甚至更小。这样加载预览会更快,如果用户看图片的时间足够长,你可以加载完整的图片。

在现代照片中,图像的原始尺寸通常比正常显示的大得多。因此,如果你总是读取原始图像,你就会在一些永远不会显示的东西上花费大量的磁盘IO。

通常提示:在你的程序中可能不是case。与任何性能问题测量一样,然后优化。