低 DPI 图像未在 WPF 图像中完全显示

Low DPI images are not fully shown in WPF Image

所以我有一个包含图像的用户控件

 <StackPanel>
            <Image HorizontalAlignment="Left" VerticalAlignment="Top" x:Name="RenderingImage" 
    RenderTransformOrigin="0,0"  Stretch="None" Source="{Binding}" RenderTransform="{Binding}"/>
  </StackPanel>

只要显示的图像是 96 或以上,一切都正常。对于较小的 DPI 图像,由于某种原因,图像组件会裁剪图像

这是完整的图像,当我尝试在图像组件中显示它时 它裁剪右侧。

具体来说这张图片是72dpi。除了更改 Stretch 之外,有什么办法可以避免这种情况?将 Stretch 更改为 Fill/Uniform 似乎可行,但这改变了我为此特定 UC 实现缩放和其他事件的方式。我想避免这种情况。同样重要的是我保留了图像的原始大小,拉伸显然对我没有帮助。

WPF 1/96 英寸中“设备独立像素”的原始宽度和高度 - 即 WPF 使用 96 DIP/inch 或 DPI 绘制。

如果您加载具有不同 DPI 的位图,BitmapSource 将缩放为 96 DPI,即其宽度和高度属性设置为

bitmap.Width  = bitmap.PixelWidth  * 96 / bitmap.DpiX
bitmap.Height = bitmap.PixelHeight * 96 / bitmap.DpiY

当拉伸设置为 None 时,这些值用于图像元素的大小。


为了补偿这种缩放,您可以创建一个反转缩放的位图,例如通过将适当的 ScaleTransform 应用于 TransformedBitmap 的 Transform 属性。

var scaled = new TransformedBitmap(bitmap,
    new ScaleTransform(bitmap.DpiX / 96, bitmap.DpiY / 96));

您因此确保缩放位图的宽度和高度始终等于其 PixelWidth 和 PixelHeight。