【发布时间】:2011-11-24 06:03:39
【问题描述】:
我有一个从具有透明度的 PNG 加载的形状(蓝色):
然后我用QPainter::drawEllipse在这个形状(红色)上画几个圆圈。
这样的结果有点类似于第三张图片,红色的形状完全覆盖了蓝色的形状:
然而,我希望蓝色形状充当红色形状的遮罩,结果如下:
QPainter 可以做到吗?
【问题讨论】:
我有一个从具有透明度的 PNG 加载的形状(蓝色):
然后我用QPainter::drawEllipse在这个形状(红色)上画几个圆圈。
这样的结果有点类似于第三张图片,红色的形状完全覆盖了蓝色的形状:
然而,我希望蓝色形状充当红色形状的遮罩,结果如下:
QPainter 可以做到吗?
【问题讨论】:
这是可能的。假设您将 PNG 加载到 QImage 中,您可以执行以下操作从图像创建蒙版:
QImage img("your.png");
QPixmap mask = QPixmap::fromImage(img.createAlphaMask());
请参阅 QImage 中 create*Mask 的其他函数以获取替代方法。
那么设置painter的剪辑区域就很简单了:
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>