使用ImageBrush拼贴是否可以关闭抗锯齿?

问题描述 投票:0回答:1

使用ImageBrush时是否可以在WPF中关闭抗锯齿?

给出以下代码:

var handleImage = new BitmapImage(new Uri($"pack://application:,,,/Resources/myimage.png"));
var imageBrush = new ImageBrush(handleImage);
imageBrush.AlignmentY = AlignmentY.Top;
imageBrush.AlignmentX = AlignmentX.Left;
imageBrush.Stretch = Stretch.Uniform;
imageBrush.Viewport = new Rect(0, 0, _handleImage.Width, _handleImage.Height);
imageBrush.ViewportUnits = BrushMappingMode.Absolute;
imageBrush.TileMode = TileMode.Tile;
drawingContext.DrawRectangle(imageBrush, null, new Rect(0, 0, width, height));

给我类似:WPF Output

但是我期望:Expected Output

WPF的默认抗锯齿效果使它看起来很糟糕。我尝试过UseLayoutRounding=trueSnapsToDevicePixels=trueRenderOptions.SetBitmapScalingMode(this, BitmapScalingMode.HighQuality),窗口上的RenderOptions.SetBitmapScalingMode(this, BitmapScalingMode.NearestNeighbor) RenderOptions.SetEdgeMode(this, EdgeMode.Unspecified);。唯一可以改变视觉差异的是BitmapScalingMode.NearestNeighbor,但看起来仍然很奇怪,并且拼贴重叠。

编辑:下载完整的工作示例:WpfImageBrushExample.zip

wpf wpf-controls antialiasing imagebrush
1个回答
0
投票

这里的问题是BitmapImage的宽度和高度是不同的小数-在这种情况下,它是5.333 x 6x666而不是预期的4 x 5像素。如果我使用_handleImage.PixelWidth_handleImage.PixelHeight,则此问题已解决,并且在设置的任何这些渲染选项下都不会出现怪异的别名。

var handleImage = new BitmapImage(new Uri($"pack://application:,,,/Resources/myimage.png"));
var imageBrush = new ImageBrush(handleImage);
imageBrush.AlignmentY = AlignmentY.Top;
imageBrush.AlignmentX = AlignmentX.Left;
imageBrush.Stretch = Stretch.Uniform;
imageBrush.Viewport = new Rect(0, 0, _handleImage.PixelWidth, _handleImage.PixelHeight);
imageBrush.ViewportUnits = BrushMappingMode.Absolute;
imageBrush.TileMode = TileMode.Tile;
drawingContext.DrawRectangle(imageBrush, null, new Rect(0, 0, width, height));

产生:Expected

© www.soinside.com 2019 - 2024. All rights reserved.