This question already has answers here:
C++ and Qt: Paint Program - Rendering Transparent Lines Without Alpha Joint Overlap

(2个答案)


5年前关闭。




我正在使用QT,并且能够创建基本的MS油漆铅笔绘图工具。
我通过用直线连接一系列点来创建了铅笔工具。
它对于不透明的细线看起来不错,但是对于粗线和透明线,我会得到一个alpha透明重叠(因为这些线在一个共享点处相交)。我已经研究过,一些建议是在一个单独的透明缓冲区上绘制并在那里渲染并获得最大的不透明度,然后将其渲染回原始缓冲区,但是我真的不知道如何在Qt中做到这一点。

我对图形或Qt的经验不足,所以我不知道这种方法。诸如MyPaint和Krita之类的程序如何处理画笔以保持漂亮的透明线而不重叠?

我不想要的:



我想要的效果:

最佳答案

因为您没有显示任何代码,所以我将假设您正在做的工作是存储一组点,然后在paint函数中使用painter绘制这些点。获得的效果是当您在已绘制的区域上绘制时。

可以用来防止这种情况的一种方法是使用QPainterPath对象。发生鼠标按下事件时,请对QPainterPath对象使用moveTo函数。然后为鼠标移动事件调用lineTo函数。

最后,当涉及到渲染时,而不是绘制点,而是渲染QPainterPath对象。

----------编辑--------------------------------------

由于您已经添加了所需效果的示例,因此我可以更好地理解您的问题,并且您可能无法在此处使用QPainterPath,但是我建议将其用于不透明的线条。

但是,如果在将线条添加到QPainterPath之前计算出渐变的变化,则可以将渐变笔与QPainterPath一起使用,并以所需的方式工作。或者...

您在原始答案中提到了这一点:-



这听起来比单词缓冲区要复杂得多。实际上,您只是创建一个单独的QImage并绘制到该图像上,而不是在屏幕上绘制。然后在绘制屏幕时,您可以复制图像。要“获得最大不透明度”,您可以扫描图像上的位并查看alpha通道,或者保留单独的信息结构来记录笔的压力及其在每个点的位置。我希望获得当alpha增加然后减小然后线性插值以进行渲染时的最大值和最小值,而不是尝试绘制每分钟的变化。

当将缓冲图像渲染回主要图像时,我认为您需要在QPainter上设置一种合成模式,但是在我的头顶上方,我不确定是哪一个。阅读文档以了解其作用并进行实验以了解其产生的影响。

根据我在图形方面的经验,通常我发现您需要进行实验以查看有效的方法并了解自己的工作,特别是当您发现所使用的方法开始变慢并且需要优化它以合理的帧速率工作。

09-25 23:17