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



我想使用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渲染器的预期行为?

默认情况下,

QPainter使用光栅后端。这个后端似乎在内部使用预乘RGBA数据。这会导致低alpha的RGB通道中的数据丢失。似乎没有简单的方法可以改变这种行为。如果可能的话,您可以尝试使用OpenGLOpenVG后端。文档的本节介绍了后端。另一种选择是手动在QImage上实现渲染。您也可以尝试在两个不同的图像上渲染RGB和alpha通道,然后以某种方式将它们连接起来。另请参阅此问题。

最新更新