在Qt中绘制半透​​明颜色时避免颜色量化

时间:2014-02-25 18:41:29

标签: qt transparency qpainter qimage porter-duff

我想使用Qt 5.2创建带有alpha的图像,但我发现颜色值正在被量化。这是一个例子:

QColor testColor(248, 64, 16, 2);

QImage image(10, 10, QImage::Format_ARGB32);

QPainter painter(&image);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(0, 0, 5, 5, testColor);
painter.end();

qDebug("Test color was (%d, %d, %d, %d)",
       testColor.red(), testColor.green(), testColor.blue(), testColor.alpha());

QRgb value = image.pixel(1, 1);
qDebug("QPainter painted (%d, %d, %d, %d)",
       qRed(value), qGreen(value), qBlue(value), qAlpha(value));

打印出来:

Test color was (248, 64, 16, 2)
QPainter painted (255, 127, 0, 2)

在我的应用程序中,保留原始的红色,绿色和蓝色值非常重要。是否有我错过的Qt选项,或者这只是Qt 2D渲染器的预期行为?

1 个答案:

答案 0 :(得分:3)

QPainter默认使用Raster后端。看来这个后端内部使用预乘的 RGBA数据进行操作。这会导致RGB通道中的数据丢失,从而导致低alpha。似乎没有简单的方法来改变这种行为。如果可能,您可以尝试使用OpenGLOpenVG后端。后端在this section of the docs中描述。另一种选择是手动在QImage上实现渲染。您还可以尝试在2个不同的图像上渲染RGB和Alpha通道,然后以某种方式将它们连接起来。另见this question