【问题标题】:How to specify the image scaling algorithm used by a WPF Image?如何指定 WPF 图像使用的图像缩放算法?
【发布时间】:2010-05-26 12:49:17
【问题描述】:

有没有办法在LayoutTransform 设置为ScaleTransformImage 元素中指定图像如何放大,ScaleXScaleY 的整数值为ScaleY

我想清晰地显示缩放后的图像(即使用“最近邻”缩放),没有模糊。 (想象一下您希望位图编辑程序在放大时的行为方式)。

我注意到Image 上的受保护属性VisualBitmapScalingMode,因此创建了Image 的子类,将该属性设置为BitmapScalingMode.NearestNeighbor。但是,这没有任何效果。

【问题讨论】:

  • 我认为您的子类不会改变 ScaleTransform 的工作方式。您是否尝试过手动设置图像尺寸(宽度/高度)以查看是否清晰?
  • 很遗憾没有。如果我通过设置宽度和高度来扩展图像,我会得到与应用 ScaleTransform 相同的结果。我认为这是有道理的,无论哪种方式,最终都是图像决定如何在给定大小和位图的情况下呈现自己。
  • 您是否使用 TransformedBitmap 获得了更好的结果?
  • 好的,如果我在 Image 上覆盖 OnRender,也许我可以指定要在 DrawingContext 中以某种方式使用的缩放算法...
  • 好的,开始工作了。虽然我在“MyImage”(我的 Image 子类)的构造函数中设置了 VisualBitmapScalingMode 的值,但在调用 OnRender 时它被设置回未指定。因此,我重写了 OnRender,并将其设置在那里,然后调用 base.OnRender。也许在 WPF 元素的生命周期中有一些覆盖,我可以在其中设置此属性一次,但工作完成了。

标签: wpf image-scaling


【解决方案1】:

您可以在 XAML 中为 Image 控件设置 RenderOptions.BitmapScalingMode 属性。无需继承 Image 类。

【讨论】:

  • 我有一个缩放控件,可以改变孩子的变换,即使使用 NearestNeighbor 模式,孩子内部的图像也是模糊的。 OnRender 解决方案有效(WPF 4.6.2)
【解决方案2】:

我通过在 Image 子类中覆盖 OnRender 并在绘制图像之前设置 VisualBitmapScalingMode 来解决此问题:

class MyImage : System.Windows.Controls.Image
  {
    protected override void OnRender(DrawingContext dc)
    {
      this.VisualBitmapScalingMode = System.Windows.Media.BitmapScalingMode.NearestNeighbor;
      base.OnRender(dc);
    }
  }

【讨论】:

  • 这很好用。我将它用于相反的效果(即 Fant 方法),但得到了我想要的。
猜你喜欢
  • 2010-10-12
  • 1970-01-01
  • 2013-06-04
  • 2020-01-09
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2023-03-17
相关资源
最近更新 更多