使用DrawingVisual渲染1个像素线

时间:2011-04-06 19:21:55

标签: c# wpf

我已经看过几个关于在WPF中渲染1个像素行的例子,但似乎没有一个适用于我的情况。我正在使用DrawingVisual和DrawingContext绘制一些形状,使用RenderTargetBitmap和PngBitmapEncoder来生成图像。在许多情况下,矩形具有2像素边框,即使我将其设置为1.我猜这是由于使用了与分辨率无关的渲染。

我找到了几个解决方案,但它们要么是在XAML中,要么是应用于绘图控件。我发现最接近的是XSnappingGuidelines / YSnappingGuidelines,但我找不到一个如何使用它的例子。这些属性非常缺乏文档。

如何禁用DrawingVisual独立于分辨率的渲染?

更新 这是我想要做的:

声明DrawingVisual:

DrawingVisual mainTemplate = new DrawingVisual();

获取上下文:

using (DrawingContext context = mainTemplate.RenderOpen())

绘制矩形:

penToUse = new Pen(new SolidColorBrush(Color.FromRgb(0xFF, 0xFF, 0xFF)), 1.0);
penToUse.DashStyle = DashStyles.Dash;
context.DrawRectangle(brushToUse, penToUse, new Rect(left, top, width, height));

在哪里设置渲染模式以对齐像素?

jorj

2 个答案:

答案 0 :(得分:2)

在WPF中,绘制线条时,线条以您指定的坐标为中心。因此,如果在具有96 DPI的设备上绘制10,10到10,20的垂直线,并且笔的宽度为1,则实际将在9.5和10.5之间绘制两条像素。如果要对齐像素边缘上的线,则需要将其移动0.5。在120 DPI监视器上,线的宽度应为0.8以获取单个像素,您需要将其移动0.4以在像素边缘上对齐。

您不必使用GuidelineSet,因为它不会比这个简单的移动做更多的事情,但会使代码变得不必要地复杂化。

答案 1 :(得分:1)

我最接近能够使用DrawingContext在WPF中渲染单个像素行是:

GuidelineSet guidelines = new GuidelineSet();
guidelines.GuidelinesX.Add(_bgRect.Left - 0.5);
guidelines.GuidelinesX.Add(_bgRect.Right + 0.5);
guidelines.GuidelinesY.Add(_bgRect.Top - 0.5);
guidelines.GuidelinesY.Add(_bgRect.Bottom + 0.5);
dc.PushGuidelineSet(guidelines);
dc.DrawRectangle(Background, _outlinePen, _bgRect);
if (BorderThickness.Left > 1)
    dc.DrawLine(_leftPen, _bgRect.TopLeft, _bgRect.BottomLeft);
if (BorderThickness.Top > 1)
    dc.DrawLine(_topPen, _bgRect.TopLeft, _bgRect.TopRight);
if (BorderThickness.Right > 1)
    dc.DrawLine(_rightPen, _bgRect.TopRight, _bgRect.BottomRight);
if (BorderThickness.Bottom > 1)
    dc.DrawLine(_bottomPen, _bgRect.BottomRight, _bgRect.BottomLeft);
dc.Pop();