【发布时间】:2016-09-14 16:08:29
【问题描述】:
我正在尝试在 WPF 中编写一个小照片查看器,基本上模拟 Windows Photo Viewer 提供的功能。
在窗口和全屏模式下显示是使用Image 完成的
<Image Name="ImgDisplay" Source="{Binding CurrentImage.FullPath, Converter={StaticResource FilenameToImageConverter}}"/>
FilenameToImageConverter 在哪里执行以下操作
public class FilenameToImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string uri = value as string;
if (uri != null && File.Exists(uri))
{
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.None;
image.UriCachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache);
image.CacheOption = BitmapCacheOption.OnLoad;
image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
image.UriSource = new Uri(uri);
image.EndInit();
return image;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
但是,当使用我的照片(大约 8mpx,4MB jpeg 文件)测试程序时,显示图像的加载时间很长(2 或 3 秒),而 Windows 照片查看器能够轻松跳过图像。我看到它首先显示图像的低分辨率版本,然后才显示完整图像。然而,一切最终都比我的方法快得多。
我怎样才能做到这一点?都是通过缩略图/预加载吗? 提前谢谢你
编辑
感谢您提供的提示,使用 DecodePixelWidth 以及 Async/OneWay-Bindings 缩小规模已经大大改善了这种情况,但还不足以让一切变得流畅。同样使用IsAsync=true,在加载下一张图片之前,图片总是空白,这是一种令人不快的效果。
最好通过显示高度缩小的版本立即来解决这个问题,然后在异步加载时显示完整图像。由于涉及某种时间连续性,我不知道如何使用绑定来实现它。有什么建议吗?
【问题讨论】:
-
也许这个问题的建议可以提供帮助?他们建议使用单向异步绑定并将图像缩小到您实际需要显示的大小。 stackoverflow.com/questions/8960110/…
-
如果您尝试使用 Windows 照片查看器快速跳过许多(大)图像/向后快速,您会发现实际上并没有那么快。它可以预测您将访问哪些图像并提前加载它们。较新的版本使用硬件加速。此外,如果您使用图像和 WPF 绑定,您可能会发现这很有用 blog.tedd.no/2011/07/28/…
-
谢谢,这是宝贵的见解。 Photo Viewer 实际上是否依赖于 Thumbs.db,在我的程序中这样做是否值得?