我如何在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 '('
提前致谢
您的ImageManager
应该与ImageSource
s一起工作,而不是Image
s。即使您使当前的代码正常工作,您也会发现您的UI仍然挂起,因为您别无选择,只能在UI线程上执行工作。如果你转而处理ImageSource
s,你可以在后台线程中加载它们,然后冻结它们,以便从UI线程中使用它们。这使您可以预先加载图像,或者在加载时显示加载动画。
BitmapFrame.Create
可能是您想要使用的方法来加载图像
考虑缓存按比例缩小的图像——按您想要显示的比例的1:1,甚至更小。这样加载预览会更快,如果用户看图片的时间足够长,你可以加载完整的图片。
在现代照片中,图像的原始尺寸通常比正常显示的大得多。因此,如果你总是读取原始图像,你就会在一些永远不会显示的东西上花费大量的磁盘IO。
通常提示:在你的程序中可能不是case。与任何性能问题测量一样,然后优化。