11
我从PNG装有透明的形状(蓝色):如何在QPainter上使用遮罩?
然后,我对这个形状上绘制几个圈(红色)与QPainter::drawEllipse
。
的这个结果有点类似于第三画面与红色形状完全覆盖蓝色:
什么,但是我想是蓝色形状充当红色面具,结果如下:
QPainter可以做到吗?
我从PNG装有透明的形状(蓝色):如何在QPainter上使用遮罩?
然后,我对这个形状上绘制几个圈(红色)与QPainter::drawEllipse
。
的这个结果有点类似于第三画面与红色形状完全覆盖蓝色:
什么,但是我想是蓝色形状充当红色面具,结果如下:
QPainter可以做到吗?
这是可能的。假设你加载你的PNG成QImage的,你可以做这样的事情,从你的图像创建蒙版:
QImage img("your.png");
QPixmap mask = QPixmap::fromImage(img.createAlphaMask());
见对方在QImage的create*Mask
功能替代品。
然后,它的设置画家的剪辑区域的一个简单的问题:
QPainter p(this);
p.setClipRegion(QRegion(mask));
这是一个愚蠢的演示(不要使用代码-,则图像加载,面具和地区建立应缓存,他们是潜在的昂贵):
#include <QtGui>
class W: public QWidget
{
Q_OBJECT
public:
W(): QWidget(0) { }
protected:
void paintEvent(QPaintEvent *)
{
QPainter p(this);
QImage img("../back.png");
QPixmap mask = QPixmap::fromImage(img.createAlphaMask());
// draw the original image on the right
p.drawImage(300, 0, img);
// draw some ellipses in the middle
p.setBrush(Qt::red);
for (int i=0; i<100; i+=10)
p.drawEllipse(i+150, i, 20, 70);
// and do the same thing, but with the mask active
p.setClipRegion(QRegion(mask));
for (int i=0; i<100; i+=10)
p.drawEllipse(i, i, 20, 70);
}
};
将会产生这样的:对于有用的示例代码
非常感谢和+1 。 –