qt - 如何在 QPainter 中使用 mask ?

标签 qt mask qpainter

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

enter image description here

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

enter image description here

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

enter image description here

但是我想要的是蓝色形状充当红色形状的 mask ,结果如下:

enter image description here

可以用 QPainter 做到这一点吗?

最佳答案

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

QImage img("your.png");
QPixmap mask = QPixmap::fromImage(img.createAlphaMask());

请参阅 QImage 中的其他 create*Mask 函数以获取替代方案。

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

QPainter p(this);
p.setClipRegion(QRegion(mask));

这是一个愚蠢的演示(不要按原样使用该代码,图像加载、 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);
        }
};

这会产生这样的结果: enter image description here

关于qt - 如何在 QPainter 中使用 mask ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7539257/

相关文章:

json - 填充 QTableView 表单 JSON 数组

c++ - QWebChannel 新客户端获取初始状态?

ios - UIView 蒙版透明。

c# - Winforms 文本框掩码

python - pyqt打印预览QTableView

C++ 使这个 Djikstra 实现更快

c++ - qwt例子程序意外结束

c# - 将 mask 应用于位图并在运行时生成合成图像

qt - QPainter::rotate 禁用绘制文本的抗锯齿功能

c++ - 多次调用更新时 Qt 应用程序崩溃