Рендеринг линий в 1 пиксель с DrawingVisual - PullRequest
3 голосов
/ 06 апреля 2011

Я видел несколько примеров рендеринга строк размером 1 пиксель в WPF, но ни один из них не подходит для моей ситуации. Я использую DrawingVisual и DrawingContext для рисования некоторых фигур и RenderTargetBitmap и PngBitmapEncoder для генерации изображения. Во многих случаях прямоугольники имеют 2-пиксельную границу, хотя я установил ее на 1. Я предполагаю, что это связано с независимым от разрешения рендерингом.

Я нашел несколько решений, но они либо в XAML, либо применяются к элементам управления рисованием. Самая близкая вещь, которую я нашел, это XSnappingGuidelines / YSnappingGuidelines, но я не могу найти ни одного примера того, как его использовать. По этим свойствам очень не хватает документации.

Как отключить независимый от разрешения рендеринг для DrawingVisual?

UPDATE: Вот что я пытаюсь сделать:

Объявление чертежа Визуал:

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 ]

2 голосов
/ 05 октября 2011

В WPF, когда вы рисуете линию, линия центрируется по указанным вами координатам. Таким образом, если на устройстве с 96 DPI вы рисуете вертикальную линию от 10, 10 до 10, 20, а ширина пера равна 1, линия будет нарисована между 9,5 и 10,5 с использованием двух пикселей. Если вы хотите выровнять линию по краю пикселя, вам нужно сместить ее на 0,5. На мониторе с разрешением 120 DPI ширина линии должна составлять 0,8, чтобы взять один пиксель, и вам необходимо сместить ее на 0,4, чтобы выровнять по краю пикселя.

Вам не нужно использовать GuidelineSet, потому что он не делает больше, чем это простое перемещение, но излишне усложняет код.

1 голос
/ 13 мая 2011

Самое близкое к тому, что я смог визуализировать отдельные пиксельные строки в 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...