我想实现一种方法,每次调用时,它都会将QPixmap(4.8)中每个像素的alpha减少1。在两次调用之间,新行可能会添加到图像中(alpha为255)。此外,我希望有一个较低的alpha阈值,例如15.初始alpha为0的像素将保持该alpha。在伪代码中:
if alpha == 0:
newAlpha = 0
else:
newAlpha = max(15, alpha - 1)
现在我有两种方法。第一个是转换为QImage并逐个像素地减少alpha。然而,这有两个缺点:性能和颜色伪影:一些像素的颜色变化很大。当将生成的qpixmap QPain到另一个填充了一种颜色(带QPainter::CompositionMode_SourceOver
)的qpixmap时,会出现人工制品。这可能是由于抖动造成的?我试过两个可用的,都产生这些类型的人工制品。
QImage image = pixmap.toImage();
for (int y = 0; y < image.height(); ++y) {
for (int x = 0; x < image.width(); ++x) {
QRgb col = image.pixel(x,y);
int alpha = qAlpha(col);
if(alpha>15) {
alpha -= 1;
QRgb newCol = qRgba(qRed(col), qGreen(col), qBlue(col), alpha);
image.setPixel(x,y, newCol);
}
}
}
pixmap = QPixmap::fromImage(image, Qt::DiffuseAlphaDither | Qt::NoOpaqueDetection);
这些文物出现在:
QPixmap screen;
...
screen.fill(Qt::transparent);
QPainter painter( &screen );
// remove anti-aliasing, which (with current composition mode) results in even stronger artefacts
painter.setRenderHints(0);
background.fill(someRandomColor);
painter.drawPixmap(0, 0, w, h, background);
painter.drawPixmap(0, 0, w, h, pixmap);
painter.end();
或者,我尝试使用QPixmap绘图操作映射上面的伪代码。例如,QPainter QPainter::CompositionMode_DestinationIn
的合成模式可用于减少alpha。但我不知道如何处理阈值,同时保持0 alpha值。
所以现在实际上有三个问题:
我可以避免使用QImage绕道的彩色人工制品吗?
或者我可以将上面的pseude-code映射到纯QPixmap / QPainter操作?
对此有一个完全不同的想法吗?
编辑:
QImage image = pixmap.toImage().convertToFormat(QImage::Format_ARGB32);
似乎删除了人工制品。之前它会转换为QImage::Format_ARGB32_Premultiplied
,因此会转换为人工制品。但现在它的表现更差