用鼠标绘图会导致像素之间的间隙

时间:2012-01-15 12:38:02

标签: c# wpf graphics bitmap drawing

我一直在创建一个绘图应用程序作为WPF的测试,并且进展顺利。我遇到的问题是,如果我每次移动时将鼠标下的像素绘制到位图,我每次更新只会获得一个像素。当鼠标快速移动时,它不会在其间绘制像素。我需要知道在使用WriteableBitmap

的WPF中,在像素之间画一条线的最佳方法是什么 编辑:现在我有了这个:

LinesNotConnected

2 个答案:

答案 0 :(得分:3)

如果你想绘制一条线,你不应该一次只改变一个像素的颜色,而应该在每个MouseMove事件处理方法中保存鼠标的位置。

然后,您应该在上一个位置(从上一个事件发生中保存的位置)之间绘制一条线,并在这两个点之间绘制一个Line。这将使线条连续。有关WriteableBitmap上绘制线的信息,请访问:Drawing line using WPF WriteableBitmap.BackBuffer

绘制线后,不要忘记更新保存到当前位置的先前位置:)。

<强>更新

我也找到了另一种解决方案。

使用您想要绘制的图像定义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);
        }
    }

答案 1 :(得分:2)

我意识到你已经回答了你的问题,但是为了解决有这个问题的其他人的缘故,我想发帖。我是那些人的其中一个。

我的情况是,我的图纸看起来与原始问题中的 UPDATE 部分完全相同。我解决这个问题的方法是通过不仅跟踪起点和终点而且还记录中点来绘制重叠线。当我绘制时,我使用所有三个点绘制,然后更新起点 - &gt;中点,中点 - &gt;终点,终点 - &gt;相对于你正在使用的任何东西的新位置。这使我的线条看起来更好,更好。

希望这对与我有同样问题的人有所帮助。