我主要想听听建议..
我的程序在屏幕上显示多个大图像.. 每个在 1-4 mbs 之间.. 150 DPI,6000x4000 分辨率,24 位深度..
我有许多其他设置可以给我较小的图像..但我需要高质量的图像..
好的,所以它很慢..但没那么慢... 唯一真正糟糕的部分是当我从一张图片切换到另一张时..
所以,我基本上每张图片都有 2 张图片.. 1 个拇指和 1 个 HQ.. 当用户放大图像时,我会加载 HQ,当用户缩小时,它会切换到缩略图。
就在那个切换点,用户必须等待大约 4-8 秒才能将 HQ 图像加载到内存并绘制到屏幕上。
下面是我加载HQ图像时使用的代码
using (DrawingContext dc = ActiveImage.imageDV.RenderOpen())
{
FileStream fs = new FileStream(ActiveImage.imagePath, FileMode.Open, FileAccess.Read, FileShare.Read);
MemoryStream ms = new MemoryStream();
fs.CopyTo(ms);
ms.Seek(0, SeekOrigin.Begin);
fs.Close();
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.CreateOptions = BitmapCreateOptions.DelayCreation;
bitmap.StreamSource = ms;
bitmap.EndInit();
//bitmap.Freeze();
dc.DrawImage(bitmap, new Rect(ActiveImage.position, ActiveImage.size));
}
下面是我加载 Thumb 图像时使用的代码
using (DrawingContext dc = ActiveImage.imageDV.RenderOpen())
{
FileStream fs = new FileStream(ActiveImage.thumbPath, FileMode.Open, FileAccess.Read, FileShare.Read);
MemoryStream ms = new MemoryStream();
fs.CopyTo(ms);
ms.Seek(0, SeekOrigin.Begin);
fs.Close();
BitmapImage bitmap = new BitmapImage();
RenderOptions.SetBitmapScalingMode(bitmap, BitmapScalingMode.NearestNeighbor);
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.CreateOptions = BitmapCreateOptions.DelayCreation;
bitmap.StreamSource = ms;
bitmap.EndInit();
//bitmap.Freeze();
dc.DrawImage(bitmap, new Rect(ActiveImage.position, ActiveImage.size));
}
有什么办法可以优化吗?有更好的方法吗? 请记住,只有当用户正在查看单个图像时,我才需要 HQ Crystal 般清晰的图像。
我想 MemoryStream 可能会出来,但我将其添加为一种测试..
最佳答案
只是一个猜测,但将所有潜在的优化留给 WPF 并仅通过其 URI 加载图像可能不是“最佳”解决方案:
using (DrawingContext dc = ActiveImage.imageDV.RenderOpen())
{
var bitmap = new BitmapImage(new Uri(ActiveImage.imagePath));
// alternatively, if it is a relative path
// var bitmap = new BitmapImage(new Uri(ActiveImage.imagePath, UriKind.Relative));
dc.DrawImage(bitmap, new Rect(ActiveImage.position, ActiveImage.size));
}
关于c# - 图像到内存慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15593510/