我从一段只是访问图像坐标的代码中得到意想不到的输出,这是一个片段:
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。
答案 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;
}