我的图像大约是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;