Рисование мышью вызывает разрывы между пикселями - PullRequest
5 голосов
/ 15 января 2012

Я создавал приложение для рисования в качестве теста для WPF и работал хорошо. Проблема, с которой я столкнулся, заключается в том, что если я рисую пиксель под мышкой в ​​растровом изображении при каждом его перемещении, я получаю только один пиксель за обновление. Когда мышь движется быстро, она не рисует пиксели между ними. Мне нужно знать, как лучше всего провести линию между пикселями в WPF, используя WriteableBitmap

РЕДАКТИРОВАТЬ: Теперь у меня есть это:

LinesNotConnected

Ответы [ 2 ]

3 голосов
/ 15 января 2012

Если вы хотите нарисовать линию, вы должны не просто менять цвета по одному пикселю за раз, а сохранять положение мыши в каждом MouseMove методе обработки событий.

Затем вы должны нарисовать линию между предыдущей позицией (которая была сохранена из предыдущего события) и нарисовать Line между этими двумя точками. Это сделает линию непрерывной. Информацию о рисовании линий на WriteableBitmap можно найти здесь: Рисование линий с использованием WPF WriteableBitmap.BackBuffer .

После рисования линии не забудьте обновить предыдущую позицию, сохраненную до текущей:).

UPDATE

Я также нашел другое решение.

Определите XAML с изображением, на котором вы хотите нарисовать:

<Window x:Class="SampleWPFApplication.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="500" Width="520" Loaded="Window_Loaded" PreviewMouseDown="Window_PreviewMouseDown">
<Grid x:Name="layoutRoot" Background="Transparent">
    <Image x:Name="image" />
</Grid>

А затем добавить код с обработанными событиями:

//set width and height of your choice
RenderTargetBitmap bmp = null;
//...
private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        //initialize RenderTargetBitmap object
        bmp = new RenderTargetBitmap((int)this.ActualWidth, (int)this.ActualHeight, 90, 90, PixelFormats.Default);

        //set initialized bmp as image's source
        image.Source = bmp;
    }

    /// <summary>
    /// Helper method drawing a line.
    /// </summary>
    /// <param name="p1">Start point of the line to draw.</param>
    /// <param name="p2">End point of the line to draw.</param>
    /// <param name="pen">Pen to use to draw the line.</param>
    /// <param name="thickness">Thickness of the line to draw.</param>
    private void DrawLine(Point p1, Point p2, Pen pen, double thickness)
    {
        DrawingVisual drawingVisual = new DrawingVisual();

        using (DrawingContext drawingContext = drawingVisual.RenderOpen())
        {
            //set properties of the Pen object to make the line more smooth
            pen.Thickness = thickness;
            pen.StartLineCap = PenLineCap.Round;
            pen.EndLineCap = PenLineCap.Round;

            //write your drawing code here
            drawingContext.DrawLine(pen, p1, p2);
        }
    }
2 голосов
/ 27 июля 2012

Я понимаю, что вы уже ответили на свой вопрос, но хотели опубликовать ради кого-то еще, у кого есть эта проблема.Я один из тех людей.

У меня была ситуация, когда мои рисунки выглядели в точности как раздел ОБНОВЛЕНИЕ в исходном вопросе.Я исправил это, рисуя перекрывающиеся линии, отслеживая не только начальную и конечную точки, но и среднюю точку.Когда я рисую, я рисую, используя все три точки, а затем обновляю начальную точку -> среднюю точку, среднюю точку -> конечную точку, конечную точку -> новую позицию относительно того, что вы рисуете.Это заставило мои строки выглядеть намного лучше.

Надеюсь, это поможет кому-то, у кого была такая же проблема, как и у меня.

...