Конструктор Qt 4.7 QColor: возможная ошибка?

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

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.


person Mykyta    schedule 08.06.2011    source источник
comment
Используйте кнопку кода, чтобы отформатировать код (с отступом в 4 пробела). Встроенный код выполняется с помощью обратных кавычек: `   -  person rubenvb    schedule 08.06.2011
comment
Является ли cspec вашего tesCol QColor::Rgb?   -  person Stephen Chu    schedule 08.06.2011


Ответы (2)


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;
}
person O.C.    schedule 09.06.2011
comment
Хотя лучше поздно, чем никогда, проблема была именно в этом. - person Mykyta; 13.04.2012

В описании класса QColor (в разделе Точность целочисленного и плавающего часть) поясняется, что цветовая составляющая хранится в виде 16-битного целого числа. Таким образом, значения RGBA хранятся в диапазоне 0-65535. Так что, возможно, код изменился и теперь возвращает 16-битное целое число вместо 8-битного.

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

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

person Patrice Bernassola    schedule 08.06.2011
comment
Странно то, что я использую один и тот же код уже несколько месяцев, и возвращаемые целочисленные значения всегда были 8-битными. Эти значения ДЕЙСТВИТЕЛЬНО соответствуют 16-битным эквивалентам значений пикселей изображения. Это все очень странно. - person Mykyta; 08.06.2011
comment
Возможно, попробуйте версию Qt для разработчиков, которая не была восстановлена ​​​​в окончательной версии. - person Patrice Bernassola; 08.06.2011