Qt 4.7 QColor конструктор: возможная ошибка? - PullRequest
0 голосов
/ 08 июня 2011

Я получаю неожиданный вывод из фрагмента кода, который просто обращается к координатам изображения, вот фрагмент:

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? Я не очень уверен в том, что именно происходит.

Есть идеи, что может быть причиной такого поведения? Я использую Qt 4.7 в Ubuntu 10.10.

Ответы [ 2 ]

0 голосов
/ 09 июня 2011

QColor - это объединение различных структур.Каждая структура состоит из 5 шорт без знака.

QT использует внутреннее смещение бит для хранения значений RGB.Поэтому, когда вы назначаете «1» в качестве синего компонента, он переводит его, например, на 257. Когда вы изучаете QColor, ваш отладчик покажет вам 257 в качестве синего компонента, и вы удивитесь!

С другой стороны, когда выиспользуйте метод blue () QColor, который вы должны получить 1!

Не используйте отладчик для проверки QColor, используйте его методы получения и установки.

Вот пример, взятый из 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;
}
0 голосов
/ 08 июня 2011

В описании класса QColor (в части Integer vs Precision с плавающей запятой) объясняется, что компонент цвета хранится с использованием 16-разрядного целого числа.Значения RGBA хранятся в диапазоне 0-65535.Поэтому, возможно, код эволюционировал и теперь возвращает 16-разрядное целое число вместо 8-разрядного.

Я не могу сейчас проверить, но возникает вопрос: является ли результат функции неправильным или документация неправильной?

Вы должны открыть вопрос, чтобы указать это команде разработчиков Qt.

...