【问题标题】:Low DPI images are not fully shown in WPF Image低 DPI 图像未在 WPF 图像中完全显示
【发布时间】:2020-07-13 09:31:48
【问题描述】:

所以我有一个包含图像的 UserControl

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

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

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

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

【问题讨论】:

  • 假设source是原始的BitmapSource,如果你使用new TransformedBitmap(source, new ScaleTransform(source.DpiX / 96, source.DpiY / 96))作为Image的Source呢?
  • @Clemens 这无济于事,它改变了图像的比例。我已经这样做了以进行缩放。它仍然不适合孔位图到图像组件中。
  • 它不会改变 Image 元素的比例,只会改变它的 Source 位图。但是,我们当然需要更多关于您实际在做什么的详细信息,以便能够提供任何帮助。
  • @Clemens 你想知道什么细节,我可以告诉你。我有一个带有图像(WritableBitmap)并允许用户对图像执行缩放的 UserControl。我使用 ScaleX/ScaleY 进行缩放。
  • @Clemens 我已经尝试过您的解决方案并且它有效,请您详细说明一下,我不知道它为什么有效。

标签: wpf image stretch


【解决方案1】:

WPF 1/96 英寸中“设备无关像素”的原始宽度和高度 - 即 WPF 以 96 DIP/英寸或 DPI 绘制。

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

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

当 Stretch 设置为 None 时,这些值用于 Image 元素的大小。


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

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

因此,您要确保缩放位图的 Width 和 Height 始终等于其 PixelWidth 和 PixelHeight。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多