在绘画应用中实现自由绘制

4
我想请教如何在绘画应用程序中实现自由绘制。考虑到命令对象将包括点击、任意拖动和释放操作,如何在命令中存储这些信息,并将其绘制到位图上?
首先,每个像素坐标是否可以简单地作为鼠标移动命令报告的数据并放入一个大列表中?我无法想到其他明显的方法,因为用户可能不会绘制完全直线的长线条,这样可以进行优化。
绘制过程是在鼠标移动时,在每个报告的坐标处盖上实心圆(半径为笔宽),如果距离足够远,则在圆之间插值?
更新:当我问数据如何存储时,我的意思是指命令对象中的数据看起来将是一个“移动到”像素坐标的列表,以表示该操作。我不是指正在绘制的位图图像中数据的表示。

你所做的评论是我会这样做的(在鼠标按下时开始绘制,对于每个移动的像素,绘制一个半径=PenWidth的圆形,继续这样做直到鼠标抬起)。 - jcolebrand
关于如何存储它,它是一个位图...就像一个大的二维数组,每个单元格都是你想要操作的颜色值。因此,您将更新每个单元格的颜色值。 - jcolebrand
你为什么不看看GIMP/Paint.NET等软件的源代码呢? - kazanaki
1个回答

0

我猜这取决于你是否想要撤销功能。如果不需要,你就不需要存储命令列表,只需在MouseMove处理程序中更新位图即可。

如果你想要撤销功能,那么你可能希望存储命令(在绘制过程中鼠标移动到的坐标列表,即鼠标按下时)。您还需要跟踪设置(例如笔半径、颜色等)。

或者,您可以在每个命令完成后存储位图的多个副本(虽然这对于大型位图会使用大量内存)。


这似乎运作得相当不错。我用笔半径在第一个点上画了一个圆,然后对于每个随后的mousemove点,我画了一条线到该点,然后在该点画了一个圆来圆角处理。我的计划是将笔半径和颜色更改作为单独的操作进行跟踪,但也许这意味着在弹出操作堆栈时,我的撤消应该越过这些非像素更改的操作。 - Joey
作为一个想法,我认为这就是Photoshop/GIMP的做法,即从每个版本到下一个版本存储图像的完整副本(或者可能是某种差异)。然而,我并不完全确定。 - jcolebrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接