Что конкретно означает 10-значный вывод функции QImage :: pixel? - PullRequest
0 голосов
/ 25 июня 2019

В настоящее время я использую Qt 5.12.3 и у меня проблемы с пониманием 10-значного вывода функции QImage :: pixel.Для этого кода:

QImage image;
image.load("D:/qtProjects/../image.png", "PNG");

for(int i = 0 ; i < 1920; i++)
        for(int j = 0; j < 1080; j++)
            std:: cout << image.pixel(i, j) << "\n";

в части вывода консоли, которую я получаю:

4278190080 4278651664 4278585871 4278651664

Проблема в том, что я не могу понять, какиспользуйте эти 10-значные числа в онлайн-калькуляторах, чтобы увидеть фактический цвет пикселей.Все, что я знаю, это то, что он как-то интерпретирует цвета в форматах ARGB или RGBA.Спасибо за внимание!

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Эти числа представляют собой 4 цветовых компонента (красный, зеленый, синий и альфа, по 8 бит каждый, и не обязательно в этом порядке), упакованные в 32-разрядное целое число без знака.

Для извлечения этих компонентов, по сути, вам нужно извлечь значение всех байтов, которые составляют 4-байтовое целое число. Для этого у вас есть несколько способов, но самый простой для понимания, вероятно, таков: последовательное деление на 256.

Поскольку значение каждого байта находится в диапазоне [0..255], вы будете извлекать информацию из 1 байта каждый раз, когда вычисляете остаток от деления этого большого числа на 256 (представьте, что байт является базовым 256 цифр.)

Итак, вот код:

unsigned char b0 = x % 256;
x = x / 256;
unsigned char b1 = x % 256;
x = x / 256;
unsigned char b2 = x % 256;
x = x / 256;
unsigned char b3 = x % 256;

В приведенном выше коде b0 получит значение младшего байта в x, а b3 будет иметь самый старший. Какой из них будет, какой компонент будет зависеть от порядка цветовых компонентов (будь то RGBA или BGRA или ARGB или ABGR), и, скорее всего, также от порядкового номера вашей машины. Но я думаю, что это будет легко понять.

Учитывая вид номеров примеров, которые вы опубликовали, я думаю, что наиболее значимый байт числа - это альфа-канал (т. Е. b3 в моем коде дает вам альфа-значение), и это, вероятно, составляет b0 быть красным, b1 зеленым и b2 синим. Возможно.

0 голосов
/ 26 июня 2019

Чтобы упростить манипуляции с изображениями, вы можете использовать класс QColor.Как и многие другие классы Qt, вы можете вывести его на консоль с помощью qDebug().Вам нужно включить <QDebug>, чтобы он был доступен.Вот пример, как использовать QColor с QImage:

QImage image;
image.load("D:/qtProjects/../image.png", "PNG");

QColor colorRead(image.pixel(0, 0));    // get color of pixel 0,0
qDebug() << colorRead;                  // output color with float values 0 - 1
qDebug() << "R: " << colorRead.red();   // output components of color as int 0 - 255
qDebug() << "G: " << colorRead.green();
qDebug() << "B: " << colorRead.blue();
qDebug() << "A: " << colorRead.alpha();

QColor colorWrite(0, 0, 255);           // instantiate other color
image.setPixelColor(0, 0, colorWrite);  // set pixel 0,0 to the color

Возможный вывод:

QColor(ARGB 1, 0.305882, 0.305882, 0.211765)
R:  78
G:  78
B:  54
A:  255
...