0

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

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。

4

2 回答 2

0

QColor类的描述(在整数与浮点精度部分)中,解释了颜色分量是使用 16 位整数存储的。因此 RGBA 值存储在 0-65535 的范围内。所以也许代码已经进化,现在返回一个 16 位整数而不是 8 位。

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

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

于 2011-06-08T13:49:51.350 回答
0

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

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

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

不要使用调试器检查 QColor 使用它的 getter 和 setter 方法。

这是取自QT 代码的示例。您可以清楚地看到位移。

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;
}
于 2011-06-09T05:45:58.693 回答