QImage在具有透明度的PNG中设置alpha

Posted

技术标签:

【中文标题】QImage在具有透明度的PNG中设置alpha【英文标题】:QImage setting alpha in PNG with transparency 【发布时间】:2014-07-29 17:59:12 【问题描述】:

我正在尝试在另一个图像上绘制图像(并且该部分有效),但在绘制叠加图像之前,我想降低它的不透明度。这就是我遇到麻烦的地方。我的叠加图像是PNG,它们本身具有透明区域,否则它们的内容是黑色的。在 Qt 中,我循环遍历每个像素,我无法确定像素是否透明——它告诉我每个像素都是黑色的,带有完整的 alpha。我试过检查像素颜色和 alpha,但我一定做错了。搜索并没有找到解决方案。这是我正在使用的小循环:

// 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】:

你的问题在于QColor(QRgb) constructor:

用颜色值构造一个颜色。 alpha 分量被忽略并设置为纯色。

你有这个问题是因为QImage::pixel(int,int) 返回一个QRgb。您应该改用QImage::pixelColor(int,int)(如果可用,在Qt 5.6 中引入),或者直接使用QRgb,如下所示:

QRgb col = image.pixel(x,y);
if(qAlpha(col) == 255) 

请注意,如果您想降低图像的不透明度,您可以随时change the QPainter opacity。

【讨论】:

行得通,感谢您的解释,我也会查看该链接。 这是一个棘手的问题,也是一个不为人知的陷阱。记录在案:使用QImage::pixelColor()(而不是QImage::pixel())不是一个足够的修复吗? @Scheff 绝对!但是,请注意 QImage::pixelColor() 是在 Qt 5.6 中引入的,该版本发布了此问题/答案。不过,现在这可能是一个更好的解决方案。我会更新答案以反映这一点。 糟糕,我不关心 Qt 版本。无法投票 - 已经完成。 ;-)

以上是关于QImage在具有透明度的PNG中设置alpha的主要内容,如果未能解决你的问题,请参考以下文章

AI 的图片如何导出无透明alpha,png格式

如何在帧中实时加入具有 alpha / 透明度的 png

如何在videoview中设置播放按钮图像png?

Python用PIL将PNG图像合成gif时如果背景为透明时图像出现重影的解决办法

在 UITableViews 中设置导航栏半透明以启动动画

在 OpenGL 中设置透明背景颜色不起作用