我开始编写一个与绘图板交互的画图程序。根据笔在平板上施加的压力,我会改变正在绘制的线条的Alpha值。这个机制是有效的。
细的线看起来不错,看起来就像真正的草图。但由于我是在两点之间画线(就像Qt涂鸦教程中一样)进行绘画,所以在线接头处有一个Alpha重叠,对于粗的笔触非常明显。
下面是线之间连接的效果:
您可以看到,线段之间有一个丑陋的Alpha混合。
为了解决这个问题,我决定使用QPainterPath
来渲染线条。
两个问题如下:
- 长时间连续使用粗路径会使程序很卡。
- 由于路径是连接的,因此对Alpha值的任何更改都会影响整个路径(但我不想这样做,因为我想保留混合效果)。
以下图像使用了QPainterPath
。
我想保留的混合效果。
下图显示了第2个问题,即会更改整个路径的Alpha值和粗细程度。
红色文本应该是:“如果在不从平板表面移除笔的情况下增加压力,则线条变粗”(Alpha变为不透明)
另一件事是,使用这种方法我只能得到从深到浅(或从粗到细)路径宽度的混合轨迹,但不能得到从浅到深的轨迹。我不确定为什么会出现这种效果,但我最好的猜测是与路径的线段更新有关。
我确实让程序基于笔在平板上施加的压力增加/减少Alpha值和线条厚度。
问题是我想渲染没有Alpha重叠的线条,而QPainterPath
会更新整个路径的Alpha值和厚度,这是我不想要的。
这是创建路径的代码:
switch(event->type()){
case QEvent::TabletPress:
if(!onTablet){
onTablet = true;
//empty for new segment
freePainterPath();
path = new QPainterPath(event->pos());
} break;
case QEvent::TabletRelease:
if(onTablet)
onTablet = false;
break;
case QEvent::TabletMove:
if(path != NULL)
path->lineTo(event->pos());
if(onTablet){
//checks for pressure of pen on tablet to change alpha/line thickness
brushEffect(event);
QPainter painter(&pixmap);
//renders the path
paintPixmap(painter, event);
} break;
default:;
}
update();
我希望将单一路径效果应用于由Krita绘画程序创建的图像:。