WPF图像RenderOptions.BitmapScalingMode.LowQuality消耗的内存比HighQuality多10倍

时间:2015-04-01 12:36:18

标签: c# wpf image memory render

我的图像大约是5k x 5k像素。
该图像包含带有ScaleTransform的LayoutTransform。

<Image x:Name="image" Source="{Binding ImageSource, Mode=OneWay}" Width="{Binding ImageWidth, Mode=OneWay}" Height="{Binding ImageHeight, Mode=OneWay}" Visibility="{Binding ImageVisibility, Mode=OneWay}" RenderOptions.BitmapScalingMode="HighQuality" RenderOptions.EdgeMode="Aliased">
     <Image.LayoutTransform>
          <ScaleTransform  ScaleX="{Binding ScaleValue, Mode=OneWay}" ScaleY="{Binding ScaleValue, Mode=OneWay}"/>
     </Image.LayoutTransform>
</Image>

由于HighQuality选项导致缩放图像非常慢,因此我决定在缩放过程中将其设置为LowQuality。事实证明,LowQuality选项消耗的内存比HighQuality多得多,正如您在屏幕截图中看到的那样。

RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.LowQuality); //Reduce quality during resize to improve performance (or not :()


将设置为低电平后的存储器峰值不是暂时的 - 它会一直保持到应用程序关闭之前。第二次或第三次调整大小操作对峰值没有影响。

我相信Image Control会缓存某种形象 - 但不确定。
如果没有手动销毁BitmapImage,我也会遇到内存泄漏,但我认为这不是问题,因为峰值发生在RenderOption-change期间。

非常感谢任何想法

修改
这是我用来加载图片的代码:

Stream imageStreamSource = new FileStream(_filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);

BitmapSource bmSrc = decoder.Frames[0];
bmSrc.Freeze();

ImageSource = bmSrc;

enter image description here

0 个答案:

没有答案