如何使用QPainter来绘制遮罩?

15

我有一个带有透明度的PNG图形(蓝色):

图片描述

然后我使用 QPainter::drawEllipse 在这个形状上绘制了几个圆圈(红色)。

图片描述

结果是类似于第三张红色完全覆盖蓝色的图片:

图片描述

然而,我想要的是对红色形状进行蓝色形状的遮罩,得到以下结果:

图片描述

在 QPainter 中是否有可能做到这一点?

1个回答

31

可以实现。假设你正在将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);
        }
};

这将产生类似于以下内容的东西: 在此输入图片描述


QRegion没有一个接受QPixmap的构造函数? - Paul Knopf
@PaulKnopf: 它有一个函数可以接受 QBitmap,而 QPixmap 可以转换为 QBitmap。 - Mat
1
@paul-knopf:你需要 #include <QBitmap> - Kaaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接