我正在使用QT,我能够创建一个基本的MS绘画铅笔绘图工具。 我通过用线连接一系列点来创建铅笔工具。 对于不透明的细线看起来不错,但是通过粗而透明的线条,我得到了alpha透明度重叠(因为线条在共享点处相交)。我已经研究了一些建议是在一个单独的透明缓冲区上绘制并在那里渲染并获得最大的不透明度并将其渲染回原始缓冲区但我真的不知道如何在Qt中这样做。
我对图形或Qt没有太多经验,所以我不知道这种方法。像MyPaint和Krita这样的程序如何处理画笔以保持漂亮的透明线条而不会重叠?
我不想要的东西:
我想要的效果:
答案 0 :(得分:2)
由于你没有显示任何代码,我将假设你正在做的是存储一组点然后在绘画函数中,使用画家绘制这些点。你得到的效果是当你画过你已经画过的区域时。
可以使用一种方法来防止这种情况,即使用QPainterPath对象。发生鼠标按下事件时,请对QPainterPath对象使用moveTo函数。然后调用lineTo函数进行鼠标移动事件。
最后,在渲染时,不是绘制点,而是渲染QPainterPath对象。
----------编辑------------------------------------ -
由于你已经添加了你想要的效果的例子,我更好地理解了你的问题,你可能无法在这里使用QPainterPath,但我确实推荐它用于不透明的线条。
但是,如果在将行添加到QPainterPath之前计算出渐变更改,则可以使用带有QPainterPath的渐变笔并按照您希望的方式使用它。可替换地...
您在原始答案中提到了这一点: -
在单独的透明缓冲区上绘制并在那里渲染并获得最大不透明度并将其渲染回原始缓冲区。
这听起来比单词缓冲区更复杂。实际上,您只需创建一个单独的QImage并绘制到它而不是屏幕。然后,在绘制屏幕时,您将复制图像。要“获得最大不透明度”,您可以扫描图像上的位并查看Alpha通道,或者保留单独的信息结构,以记录笔的压力及其在每个点的位置。我希望得到alpha增加时的最大值和最小值,然后减小并线性插值渲染值,而不是尝试映射每一分钟的变化。
当将缓冲区图像渲染回主图像时,我认为你需要在QPainter上设置一个合成模式,但是在我的脑海中,我不确定是哪一个。阅读文档以了解它们的作用并进行实验,以了解它们产生的效果。
根据我对图形的体验,通常情况下,我发现你需要尝试看看哪些有效,并了解你正在做什么,特别是当你发现你正在使用的方法开始变慢并且您需要优化它以合理的帧速率工作。
答案 1 :(得分:2)
请参阅我对this问题的回答。这同样适用于此。
为了不给出链接,我将在此重复答案:
您需要将画家的构图模式设置为来源。它现在绘制了源和目的地。
painter.setCompositionMode(QPainter的:: CompositionMode_Source);
如果您希望通过底层图形显示透明区域,则需要将结果的合成模式设置回CompositionMode_SourceOver并绘制目标。
我不知道你是否还在寻找答案,但我希望这对某人有帮助。