当我画这样的东西(这里只是随机图)时:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DrawingVisual visual = new DrawingVisual();
DrawingContext context = visual.RenderOpen();
Pen pen = new Pen(Brushes.Black, 1);
context.DrawEllipse(Brushes.YellowGreen, pen, new Point(0,0), 40, 40);
for (int i = 0; i <= 100 - 1; i++)
context.DrawLine(new Pen(Brushes.Black, 1), new Point(0, i), new Point(i, i));
context.Close();
RenderTargetBitmap bmp = new RenderTargetBitmap(100, 100, 96, 96, PixelFormats.Pbgra32);
bmp.Render(visual);
image1.Source = bmp;
}
}
DrawLine和DrawEllipse混合的颜色。 (我发现只有使用笔的DrawLine才能使用,而使用Brush的其他形式(例如Rectangle和Ellipse则不会))。即使来自基础网格背景(argh)的LinearGradientBrush中的颜色也很奇怪。
我希望将它们分别按z顺序进行完全不透明。
这里是XAML代码:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Image Name="image1" Stretch="None" />
</Window>
谢谢你的帮助。
最佳答案
使用RenderTargetBitmap会出现两个抗锯齿或亚像素化问题:
1。
禁用位图本身的子像素化(例如,当它在UIElement中呈现时)。这可以通过以下方法解决:
RenderOptions.SetBitmapScalingMode(image1, BitmapScalingMode.NearestNeighbor);
(其中image1是WPF Image对象)。
.NET 4及更高版本仅支持此功能。
在您的特定情况下,这并不重要,因为线条是逐像素渲染的。
2。
渲染为RenderTargetBitmap时,禁用子像素化。可以通过方法RenderOptions.SetEdgeMode和EdgeMode.Aliased的参数值来实现。
但是,此方法仅在以下情况下有效:
因此,您可以按以下方式重写代码:
DrawingVisual visual = new DrawingVisual();
DrawingGroup group = new DrawingGroup();
Pen pen = new Pen(Brushes.Black, 1);
group.Children.Add(new GeometryDrawing(Brushes.YellowGreen, pen, new EllipseGeometry(new Point(0,0), 40, 40)));
for (int i = 0; i <= 100 - 1; i++)
group.Children.Add(new GeometryDrawing(null, new Pen(Brushes.Black, 1), new LineGeometry(new Point(0, i), new Point(i, i))));
RenderOptions.SetEdgeMode(group, EdgeMode.Aliased);
DrawingContext context = visual.RenderOpen();
context.DrawDrawing(group);
context.Close();
RenderTargetBitmap bmp = new RenderTargetBitmap(100, 100, 96, 96, PixelFormats.Pbgra32);
bmp.Render(visual);
image1.Source = bmp;