QImage 如何在具有透明度的 PNG 图片中设置 alpha 值

4

我正在尝试在另一张图片上绘制一个图像(这部分已经实现),但是在绘制覆盖图像之前,我想要降低它的不透明度。这就是我遇到困难的地方。我的覆盖图像是PNG格式的,并且它们本身具有透明区域,否则它们的内容是黑色的。在Qt中,我正在循环遍历每个像素,但我无法确定像素是否透明 - 它告诉我每个像素都是完全不透明的黑色。我已经尝试检查像素颜色和α值,但我肯定做错了。搜索没有给出解决方案。这是我使用的小循环:

// Set Alpha
for (int x = 0; x < overlay.width(); x++)
{
    for (int y = 0; y < overlay.height(); y++)
    {
        pixelColor = QColor(overlay.pixel(x,y));

        if (pixelColor.alpha() == 255)
        {
            overlay.setPixel(x, y, QColor(0,0,0,200).rgba());
            //qDebug() << "Not Skipped";
        }
        else
        {
            qDebug() << "Skipped";
        }
    }
}

QImage指出我的叠加图像格式为Format_ARGB32。有人知道我做错了什么吗?根据Qt文档,我应该能够使用alpha()函数,但它为每个像素返回255。也许我获取的颜色不正确?

1个回答

3
您的问题与 QColor(QRgb) 构造函数 有关:

使用给定的 color 值构造颜色。alpha 组件将被忽略并设置为不透明。

您遇到这个问题是因为 QImage::pixel(int,int) 返回一个 QRgb。您应该改用 QImage::pixelColor(int,int)(如果可用,从 Qt 5.6 开始引入),或直接使用 QRgb,例如:
QRgb col = image.pixel(x,y);
if(qAlpha(col) == 255) {}

请注意,如果您想降低图像的不透明度,您可以随时更改QPainter的不透明度

可以的,谢谢你的解释,我也会查看那个链接。 - GregInWI2
这是一个棘手的问题和一个欺骗性的陷阱。为了记录:使用QImage::pixelColor()(而不是QImage::pixel())是否足以解决问题? - Scheff's Cat
@Scheff 当然可以!但请注意,QImage::pixelColor() 是在 Qt 5.6 中引入的,晚于这个问题/答案。现在可能有更好的解决方案。我会更新答案以反映这一点。 - kestrel
1
哎呀,我没注意Qt的版本。无法点赞 - 已经完成了。;-) - Scheff's Cat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接