Как не рисовать нечетких / размытых линий в DrawingImage / DrawingContext?

#wpf

#wpf

Вопрос:

Смотрите изображение. Я бы хотел, чтобы средняя линия была четкой линией в 1 пиксель. Вы можете скопировать и вставить образец разметки в kaxaml .

альтернативный текст http://img832.imageshack.us/img832/1704/lines.png

 
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <Image SnapsToDevicePixels="True" Stretch="None">
      <Image.Source>
         <DrawingImage>
            <DrawingImage.Drawing>
               <DrawingGroup>
                  <GeometryDrawing>
                     <GeometryDrawing.Pen>
                        <Pen Brush="Red" Thickness="1"/>
                     </GeometryDrawing.Pen>
                     <GeometryDrawing.Geometry>
                        <LineGeometry StartPoint="0,0" EndPoint="50,0"/>
                     </GeometryDrawing.Geometry>
                  </GeometryDrawing>
                  <GeometryDrawing>
                     <GeometryDrawing.Pen>
                        <Pen Brush="Black" Thickness="1"/>
                     </GeometryDrawing.Pen>
                     <GeometryDrawing.Geometry>
                        <LineGeometry StartPoint="0,5.860" EndPoint="50,5.860"/>
                     </GeometryDrawing.Geometry>
                  </GeometryDrawing>
                  <GeometryDrawing>
                     <GeometryDrawing.Pen>
                        <Pen Brush="Black" Thickness="1"/>
                     </GeometryDrawing.Pen>
                     <GeometryDrawing.Geometry>
                        <LineGeometry StartPoint="0,12" EndPoint="50,12"/>
                     </GeometryDrawing.Geometry>
                  </GeometryDrawing>
               </DrawingGroup>
            </DrawingImage.Drawing>
         </DrawingImage>
      </Image.Source>
   </Image>
</Page>
  

Ответ №1:

Я нашел решение по адресу: http://msdn.microsoft.com/en-us/library/system.windows.media.renderoptions.setedgemode.aspx

 <Image Stretch="None" RenderOptions.EdgeMode="Aliased">
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
  

Комментарии:

1. Сработало отлично и оправдало мое использование изображения с DrawingImage в качестве исходного в отличие от техники DrawingBrush, которую я обычно использую для значков XAML.

Ответ №2:

Измените среднюю линию на:

 <LineGeometry StartPoint="0,6" EndPoint="50,6"/>
  

Вы можете получить четкую линию на границе пикселя, поместив линию на целую пронумерованную единицу.

Комментарии:

1. Я ищу общее решение, например, флаг. У меня была похожая проблема в CoreGraphics, и решением было перевести преобразовать мой контекст 0.5, 0.5

Ответ №3:

Я видел аналогичную проблему с пограничным контролем, хотя @phi ваше решение работало в большинстве случаев, мне также пришлось добавить следующее, чтобы заставить его полностью работать:

 SnapsToDevicePixels="True"