c# - 图像到内存慢

标签 c# wpf image

我主要想听听建议..

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

相关文章:

javascript - 根据 gridview 行调用 javascript 函数

wpf - 自动建议组合框 - MVVM

java - 如何调整JLabel ImageIcon的大小?

java - 如何通过Java程序编辑图像?

css - 根据分辨率自动调整背景图像大小

c# - 如何从 IEnumerable 获取模型元数据?

c# - 有用或不重要的双重接口(interface)的例子

c# - 是否可以在xamarin表单中访问从第一页到第二页的进度条?

c# - 如何获得自动调整大小的 WPF 窗口的大小?

c# - 是否可以在 unix 上使用 WPF?