функция сканирования в классе qimage

Разрабатываю приложение для редактирования растровой графики. В этом приложении мне нужно создать функцию строки развертки, которая будет делать то же самое, что и функция строки развертки в классе QImage. Но я немного смущен тем, как работает функция сканирования и в целом со строкой сканирования. Например, когда я вызываю bytesPerLine () для изображения высотой 177 пикселей, я ожидал, что значение будет 531 (3 байта на каждый пиксель), но эта функция возвращает 520?

Кроме того, когда я использую uchar data = image->scanLine(y)[x] для R = 249 G = 249 B = 249, значение в переменных данных равно 255. Я действительно не понимаю это значение. Заранее спасибо :)


person Mirzet    schedule 03.12.2011    source источник
comment
Я ожидал, что каждый пиксель будет 4 байта, RGBA, 255, вероятно, является альфа-каналом. Проверьте следующие два байта.   -  person Evan Teran    schedule 03.12.2011
comment
Продолжайте, знаете ли вы, с каким форматом был создан QImage? Это напрямую влияет на размер в байтах и ​​формат каждого заданного пикселя. Из документации: ›Если вы обращаетесь к данным изображения с 32 битами на пиксель, приведите возвращаемый указатель к QRgb * (QRgb имеет 32-битный размер) и используйте его для чтения / записи значения пикселя. Вы не можете использовать указатель uchar * напрямую, потому что формат пикселей зависит от порядка байтов на базовой платформе. Используйте qRed (), qGreen (), qBlue () и qAlpha () для доступа к пикселям.   -  person Evan Teran    schedule 03.12.2011
comment
@EvanTeran: QImage был создан в формате Format_RGB32. Я понимаю, что мне нужно преобразовать возвращаемый указатель в qRgb, но мне интересно получить доступ к цвету без преобразования. Из значения, возвращаемого функцией image- ›scanLine (y) [x], я не могу понять, к какому значению цвета был осуществлен доступ.   -  person Mirzet    schedule 03.12.2011


Ответы (1)


Для надежного поведения вы должны проверить возвращаемое значение QImage::format(), чтобы узнать, какой базовый формат используется, прежде чем обращаться к необработанным данным изображения.

Qt, кажется, предпочитает формат _2 _ / _ 3_ для истинных цветов, где каждый пиксель занимает 4 байта, независимо от того, существует ли альфа-канал или нет (для формата RGB32 он просто заполняется 0xff). Если вы загружаете полноцветное изображение, вероятно, оно в одном из этих двух форматов.

Кроме того, порядок байтов на разных платформах может быть разным, по возможности используйте QRgb для доступа к 32-битным пикселям.

Кстати, разве строка развертки не должна быть горизонтальной? Я думаю, вам следует использовать width() вместо height() для вычисления длины строки развертки.

person hpsMouse    schedule 03.12.2011