我已经看过几个关于在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
答案 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();