2 回答
TA贡献1811条经验 获得超6个赞
首先,如果你保存图像,直接将绑定更改为字符串/uri,没有 BitmapImage,不需要创建它,Wpf 为你处理 public BitmapImage Image ===> public Uri Image
并删除 FileToBitmapImage。
TA贡献1865条经验 获得超7个赞
我花了几天的时间来找到解决这个问题的简单方法。我需要在不冻结 UI 的情况下以高质量显示一百多张图像。
我尝试了对绑定等的各种修改,最后只有通过代码和 Source 属性集创建 Image 控件才起作用,然后 Image 出现在界面元素树中。
在 XAML 中只有空的 ContentControl:
<ContentControl x:Name="ImageContent"/>
在代码中:
static readonly ConcurrentExclusiveSchedulerPair _pair = new ConcurrentExclusiveSchedulerPair();
// Works for very big images
public void LoadImage(Uri imageUri)
{
var image = new System.Windows.Controls.Image(); // On UI thread
RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.HighQuality);
Task.Factory.StartNew(() =>
{
var source = new BitmapImage(imageUri); // load ImageSource
Dispatcher.RunOnMainThread(() =>
{
image.Source = source; // Set source while not in UI
// Add image in UI tree
ImageContent.Content = image; // ImageContent is empty ContentControl
ImageContent.InvalidateVisual();
});
}, default, TaskCreationOptions.LongRunning, _pair.ExclusiveScheduler);
}
使用 CacheOption OnLoad 加载图像效果更好。
public static ImageSource BitmapFromUri(Uri source)
{
if (source == null)
return new BitmapImage(source);
using (var fs = new FileStream(source.LocalPath, FileMode.Open))
{
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = fs;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
bitmap.Freeze();
return bitmap;
}
}
- 2 回答
- 0 关注
- 214 浏览
添加回答
举报