我在WPF控件中有一个数据绑定对象,它正在“预览”一个多版本tiff。
该对象具有公共PreviewImage和CurrentPreviewPage。
它有一个私有的PreviewPages,它是MemoryStreams的集合(每个代表一个Tiff的页面)。
获取PreviewImage(第一次)后,此代码运行:
if (PreviewPages.Count == 0)
{
Image myImg = System.Drawing.Image.FromFile(_LocalFile);
for (int i = 0; i < (NumberOfPages); i++)
{
myImg.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, i);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
myImg.Save(ms, System.Drawing.Imaging.ImageFormat.Tiff);
PreviewPages.Add(ms);
}
}
以前的代码大约需要10秒才能运行1100KB的17页TIFF。必须有一个更好的方法来处理这个问题。 之后,这称为:
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 1000;
//bi.UriSource = new Uri(fiTemp.FullName);
bi.StreamSource = new System.IO.MemoryStream(PreviewPages[CurrentPreviewPage - 1].ToArray());
bi.EndInit();
_PreviewImage = bi;
现在,在初始化之后,这段代码非常有效(它可以像拖动绑定的滑块一样快地更改页面)。任何帮助将不胜感激。
答案 0 :(得分:2)
在主要线程上加载第一页,然后在后台加载其他页面 - 请参阅BackGroundWorker。只有主线程才能访问UI。在BackGroundWorker上,您需要决定是要一次获取一个2-x页面还是一次获取所有页面。在将第2页引入UI线程之前,用户无法访问第2页。我会实施取消。如果用户放弃,你不想占用CPU。