在Qt中更改透明图像的颜色

3
我有一个在Qt中覆盖在视频上的透明图像(QImage)。我希望仅在按钮点击时更改透明图像的颜色。请问如何实现?
谢谢。

1
有2张图片,之间进行交换。 - ratchet freak
但是我想为颜色设置不同的范围。它不需要是固定的颜色。如果是这种情况,那么应该怎么做? - Sid411
“改变颜色”是什么意思? - Mitch
透明图像为黑色。根据滑块移动或按钮点击,颜色必须以RGB值改变。 - Sid411
1个回答

11

可以用多种方式实现。我建议使用QPainter创建新图像。如果将SourceIn合成模式设置为起始图像的alpha通道,那么您所绘制的任何图形都会应用该通道。您只需要用所需的颜色填充图像即可。

QPixmap source_image; // should be preserved in a class member variable
QRgb base_color; // desired image color

QPixmap new_image = source_image;
QPainter painter(&new_image);
painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
painter.fillRect(new_image.rect(), base_color);
painter.end();

ui->label->setPixmap(new_image); // showing result

请注意,我使用QPixmap而不是QImage,因为QPixmap更有效率地显示(以及可能绘制)。如果您出于某些原因仍然想使用QImage,则此代码将在不做任何更改的情况下(当然,最后一行除外)与QImage一起工作。

源图像:源图像        结果:结果


我尝试了这种方法。它说无法在 QImage::Format_Indexed8 格式的图像上绘制。 这是因为它是一个 PNG 透明图像吗? - Sid411
我尝试使用image->setColor,因为它是一个format8图像。在这种情况下,它甚至会绘制透明的区域。我只想让非透明部分变色。谢谢。 - Sid411
1
Indexed8格式对于透明度来说并不是必需的。常用的是ARGB32格式。使用source_image = source_image.convertToFormat(QImage::Format_ARGB32);将图像转换为可绘制格式。 - Pavel Strakhov
至少在Qt 5.3.1,32位OS X上无法工作,或者我做错了什么。我只尝试使用QImage而不是QPixmap,因为我需要使用source_image.convertToFormat(QImage::Format_ARGB32);。我使用painter.fillRect(new_image.rect(), QColor("red");代替base_color。但是我得到了一个空标签。 - SexyBeast

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