如何使用QPainter的面具?

lau*_*ent 14 qt mask qpainter

我有一个从透明的PNG加载的形状(蓝色):

在此输入图像描述

然后我在这个形状(红色)上画了几个圆圈QPainter::drawEllipse.

在此输入图像描述

结果有点类似于第三张图片,红色形状完全覆盖蓝色图片:

在此输入图像描述

然而,我想要的是蓝色形状作为红色形状的面具,结果如下:

在此输入图像描述

用QPainter可以做到吗?

Mat*_*Mat 25

这是可能的.假设您正在将PNG加载到QImage中,您可以执行以下操作以从您的图像创建蒙版:

QImage img("your.png");
QPixmap mask = QPixmap::fromImage(img.createAlphaMask());
Run Code Online (Sandbox Code Playgroud)

另请参阅create*MaskQImage中的其他功能以获取替代方案.

然后设置画家的剪辑区域很简单:

QPainter p(this);
p.setClipRegion(QRegion(mask));
Run Code Online (Sandbox Code Playgroud)

这是一个愚蠢的演示(不要按原样使用该代码,应该缓存图像加载,掩码和区域创建,它们可能很昂贵):

#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);
        }
};
Run Code Online (Sandbox Code Playgroud)

产生这样的东西: 在此输入图像描述