Qt 4.7 QColor构造函数:可能的bug?

时间:2011-06-08 13:35:48

标签: qt qimage

我从一段只是访问图像坐标的代码中得到意想不到的输出,这是一个片段:

QImage image(imageFileNames[frameNumber]);
QRgb qrgb(image.pixel(493,114));
QColor testCol(qrgb);

使用调试器确保我得到正确的图像路径,我得到类似../seq/0001.png的东西,这是预期的。但是,testCol的值为:

[argb]
alpha 65535
blue 28013
green 24415
pad 0
red 59367

而不是255,255,255范围内的预期值。此外,qrb的值为4293353325.像素坐标位于图像范围(720x288图像)中,图像采用.png格式(QImage::Format_RGB32)。

我还发现这个问题似乎是整个应用程序的全局问题,所写的任何新代码似乎都继承了这种行为。

经过进一步的实验,使用以下代码:

QRgb qrgb(image.pixel(1,1)); //again this is in range
int blue = qBlue(qrgb);
int red = qRed(qrgb);
int green = qGreen(qrgb);
QColor testCol(red,green,blue, 255);

testColor仍有错误的值。但是,红色,绿色和蓝色都显示预期值。似乎这是QColor构造函数的问题?我不太确定究竟发生了什么。

任何可能导致此行为的想法?我在Ubuntu 10.10上运行Qt 4.7。

2 个答案:

答案 0 :(得分:0)

QColor类的描述中(在Integer vs float point Precision部分中),解释了使用16位整数存储颜色分量。因此RGBA值存储在0-65535的范围内。因此,代码可能已经发展,现在返回一个16位整数而不是8位。

我现在无法测试,但问题是:功能结果是错误还是文档错误?

您应该打开一个问题,将其指向Qt开发团队。

答案 1 :(得分:0)

QColor是不同结构的联合体。每个结构由5个无符号短裤组成。

QT使用内部位移来存储RGB值。因此,当您将“1”指定为蓝色组件时,它会将其移至257.当您检查QColor时,您的调试器会将257显示为蓝色组件,您会感到惊讶!

另一方面,当你使用QColor的blue()方法时,你应该得到1!

请勿使用调试器检查QColor是否使用其getter和setter方法。

以下是QT code的示例。你可以清楚地看到这一点。

QColor::QColor(QRgb color)
{
    cspec = Rgb;
    ct.argb.alpha = 0xffff;
    ct.argb.red   = qRed(color)   * 0x101;
    ct.argb.green = qGreen(color) * 0x101;
    ct.argb.blue  = qBlue(color)  * 0x101;
    ct.argb.pad   = 0;
}