如何在具有SourceOver的drawPixmap上应用alpha通道

时间:2015-03-31 08:14:33

标签: c++ qt qpainter

我试图理解QPainter的不同构图模式,但alpha通道对我来说仍然模糊不清。

让我们看看以下示例:

QPainter painter(this);
painter.setCompositionMode(QPainter::CompositioMode_SourceOver);
painter.drawPixmap(rect(), QPixmap(":/Background_1.png"));
painter.setCompositionMode(QPainter::CompositioMode_SourceAtop);
painter.drawPixmap(rect(), QPixmap(":/Background_2.png"));

使用Alpha通道正确绘制第一张图像。第二张图像应仅覆盖第一张图像中不透明的部分,但实际上覆盖率为100%。

让我们看看第二个例子:

QPainter painter(this);
painter.setCompositionMode(QPainter::CompositioMode_Source); //Changed here
painter.drawPixmap(rect(), QPixmap(":/Background_1.png"));
painter.setCompositionMode(QPainter::CompositioMode_SourceAtop);
painter.drawPixmap(rect(), QPixmap(":/Background_2.png"));

在这种情况下,第一张图像在没有Alpha通道的情况下应用,但第二张图像正确应用(仅覆盖image_1的非透明区域)。

我的问题是:

如何应用具有SourceOver功能的第一个图像,然后使用SourceAtop(第一个图像的目标alpha)应用第二个图像?

First and second example

1 个答案:

答案 0 :(得分:3)

你需要在不同的缓冲区上进行组合。

QPainter painter;

QImage image(size(), QImage::Format_ARGB32);
image.fill(0);

painter.begin(&image);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawPixmap(rect(), QPixmap("Background_1.png"));
painter.setCompositionMode(QPainter::CompositionMode_SourceAtop);
painter.drawPixmap(rect(), QPixmap("Background_2.png"));
painter.end();

painter.begin(this);
painter.drawPixmap(rect(), QPixmap("clouds-05.jpg"));
painter.drawImage(rect(), image);
painter.end();

enter image description here enter image description here enter image description here