在WPF / Surface SDK的图像控件中加载高分辨率图像

时间:2010-12-17 18:37:44

标签: c# wpf image pixelsense

我有从Web服务器获取的高分辨率图像列表。我需要在表面SDK scatterview项中填充它们。为了显示图像,我为每个图像使用图像控制。

代码逻辑:
用户具有放置在表面表上的标识标签将获取与该标签相关联的高分辨率图像的列表。获取图像是在后台运行以避免干扰UI。在后台获取JPEG图像的代码是

public BitmapSource FetchImage(string URLlink)
    {
        JpegBitmapDecoder decoder = null;
        BitmapSource bitmapSource = null;
        try
        {
            decoder = new JpegBitmapDecoder(new Uri(URLlink, UriKind.Absolute), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
        }
        catch (Exception)
        {
            decoder = new JpegBitmapDecoder(new Uri("pack://application:,,,/Resources/ImageNotFound.jpg", UriKind.RelativeOrAbsolute), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnDemand);
        }
        finally
        {
            bitmapSource = decoder.Frames[0];
            bitmapSource.Freeze();
        }
        return bitmapSource;
    }

从服务器下载图像并显示在图像控件中。但是,当加载超过10个图像时,性能严重受损并且应用程序挂起。对于低分辨率图像,我甚至可以加载20-30张图像而不会挂起或减慢应用程序。

由于我读取了图像控制的默认算法是Fant,我尝试将渲染属性转换为HighQuality。应用程序仍然悬而未决,但是低于此应用程序会杀死使用高分辨率图像进行显示的整个想法。

RenderOptions.SetBitmapScalingMode(mic.ItemImage, BitmapScalingMode.HighQuality);

是否有更好的加载图片的方法。我想第一次将图像保存到硬盘然后加载到图像源。这会有效地提高性能,因为我在想,当我直接从URL加载图像时,它会将它存储在最终耗尽的内存中。通过首先保存图像我可能会避免这种情况,但.NET实际上可能会先在临时文件中存储然后再加载。

我也尝试将BitmapCacheOption更改为所有可用选项,但它没有改进任何内容。

1 个答案:

答案 0 :(得分:0)

scatterView无法打扰很多图像。 例如,尝试用一个单一颜色的1000个矩形填充它。 它会减慢应用程序的速度。 问题无法解决,微软必须重新编码ScatterView。 但是,您可以在scatterView上停用一些效果。