QPixmap / QImage alpha减少,最小化确保alpha

时间:2013-10-29 08:44:50

标签: c++ performance qt qpixmap

我想实现一种方法,每次调用时,它都会将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,因此会转换为人工制品。但现在它的表现更差

0 个答案:

没有答案