我有一个带有透明度的PNG图形(蓝色):
然后我使用 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);
}
};
这将产生类似于以下内容的东西:
#include <QBitmap>
。 - Kaaf