如何使用 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();
我正在尝试了解 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();