使用DrawingVisual渲染1像素线
本文关键字:1像素 渲染 DrawingVisual 使用 | 更新日期: 2023-09-27 17:49:19
我看过几个在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
在WPF中,当您绘制一条线时,该线将以您指定的坐标为中心。所以如果在96 DPI的设备上,你画一条从10,10到10,20的垂直线,笔的宽度是1,这条线实际上会在9.5到10.5之间绘制,占用两个像素。如果要在像素边缘上对齐线条,则需要将其移动0.5。在一个120 DPI的显示器上,线的宽度应该是0.8来获取一个像素,你需要将它移动0.4来对齐像素边缘。
你不需要使用GuidelineSet,因为它只做这个简单的移动,但不必要地使代码复杂化。
我已经能够在WPF中使用DrawingContext渲染单像素线的最接近的是:
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();