QT QImage, как извлечь RGB?
Я хочу извлечь RGB из каждого пикселя в QImage. В идеале я хочу использовать функцию img.bits().
QImage img;
if( img.load("Red.jpg") )
{
uchar *bits = img.bits();
for (int i = 0; i < 12; i++)
{
std::cout << (int) bits[i] << std::endl;
}
}
Как манипулировать возвращенными битами? Я ожидал, что все красное, потому что картинка - это чисто красное изображение, созданное в Paint. Тем не менее, я получаю 36, 27, 237, 255, 36 и т. Д...
3 ответа
QImage img( "Red.jpg" );
if ( false == img.isNull() )
{
QVector<QRgb> v = img.colorTable(); // returns a list of colors contained in the image's color table.
for ( QVector<QRgb>::const_iterator it = v.begin(), itE = v.end(); it != itE; ++it )
{
QColor clrCurrent( *it );
std::cout << "Red: " << clrCurrent.red()
<< " Green: " << clrCurrent.green()
<< " Blue: " << clrCurrent.blue()
<< " Alpha: " << clrCurrent.alpha()
<< std::endl;
}
}
Однако этот пример выше возвращает таблицу цветов. Таблица цветов не включает одинаковые цвета дважды. Они будут добавлены один раз в порядке появления.
Если вы хотите получить цвет каждого пикселя, вы можете использовать следующие строки:
for ( int row = 1; row < img.height() + 1; ++row )
for ( int col = 1; col < img.width() + 1; ++col )
{
QColor clrCurrent( img.pixel( row, col ) );
std::cout << "Pixel at [" << row << "," << col << "] contains color ("
<< clrCurrent.red() << ", "
<< clrCurrent.green() << ", "
<< clrCurrent.blue() << ", "
<< clrCurrent.alpha() << ")."
<< std::endl;
}
Ссылка для bits()
говорит:
Возвращает указатель на данные первого пикселя. Это эквивалентно scanLine(0).
Так что, если вы проверите ссылку на scanLine()
Если вы обращаетесь к данным изображения с 32 битами на дюйм, приведите возвращенный указатель к QRgb* (QRgb имеет 32-битный размер) и используйте его для чтения / записи значения пикселя. Вы не можете использовать указатель uchar* напрямую, потому что формат пикселя зависит от порядка байтов на базовой платформе. Используйте qRed(), qGreen(), qBlue() и qAlpha() для доступа к пикселям.
Еще один вариант, вероятно, будет pixel()
функция-член.
Надеюсь, это поможет.
Одна из проблем с использованием функции bits() заключается в том, что вам необходимо знать формат исходного изображения. Вы должны конвертировать его в RGB с помощью convertToFormat.
img = img.convertToFormat(QImage::Format_RGB888);
Теперь, когда вы вызываете биты (), данные будут в формате RGB с правильным выравниванием данных.
uchar *bits = img.bits();
for (int i = 0; i < (img.width() * img.height() * 3); i++)
{
std::cout << (int) bits[i] << std::endl;
}
In Qt 5.6 was introduced QColor QImage::pixelColor(int x, int y)
method, so you can directly get color information from image pixel.