当我画这样的东西(这里只是随机图)时:

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的参数值来实现。

但是,此方法仅在以下情况下有效:
  • 该方法为DrawingGroup对象调用。
  • 抗锯齿的几何体仅通过常规图形合成嵌套(例如,如果DrawingGroup包含一个矩形,而VisualBrush封装了DrawingVisual,则即使您使用该方法,该DrawingVisual的内容也将被抗锯齿)。

  • 因此,您可以按以下方式重写代码:
        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;
    

    09-20 16:57