如何使用 SourceOver 在 drawPixmap 上应用 alpha 通道

How to apply alpha channel on drawPixmap with SourceOver

我正在尝试了解 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)?

您需要在单独的缓冲区上进行合成。

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();