3

我主要想建议..

我的程序在屏幕上显示多个大图像。每个图像在 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 清晰的图像。

我想 MemoryStream 可能会出来,但我补充说这是一种测试..

4

1 回答 1

0

只是一个猜测,但将所有潜在的优化留给 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));
}
于 2013-03-24T17:31:38.217 回答