Строка сканирования - это одна строка видеоизображения. (Термин «линия сканирования» был введен в то время, когда общепринятым методом было то, что катодный луч сканировал поверхность трубки экрана линия за линией - Линия сканирования .)
Если bytesPerLine
делится на width
(bytesPerLine
/ width
= 2560/640 = 4), это дает байты на пиксель.
Если рассчитанный байт на пиксель не является целочисленным значением, то линия выравнивается по определенному кратному (обычно 4). Свернутый пример, иллюстрирующий это:
width=458
pixelFormat=Format_RGB24
bytesPerLine=1376 (a multiple of 4)
1376/458 = 3.0043668122270742358078602620087 (согласно моему калькулятору Windows)
458 * 3 = 1374 & rarr; Есть 2 байта для заполнения строки до следующего кратного 4 (байты не используются, должны игнорироваться).
В примере с OP это не проблема & ndash; формат пикселя сам по себе имеет размер, соответствующий выравниванию строк.
Итак, 4 байта соответствуют pixelFormat
, в котором указано Format_RGB32
, что означает:
Кадр, сохраненный в 32-битном формате RGB (0xffRRGGBB). Это эквивалентно QImage :: Format_RGB32 .
как 32 бита = 4 байта.
Количество самолетов немного сложнее. Я погуглил себя и нашел одно- и многоплоскостные API :
Некоторые устройства требуют, чтобы данные для каждого входного или выходного видеокадра помещались в непрерывные буферы памяти. В таких случаях один видеокадр должен быть адресован с использованием более чем одного адреса памяти, то есть одного указателя на «плоскость». Плоскость - это суббуфер текущего кадра.
В случае OP, есть 1 самолет & ndash; цветовые компоненты пикселя хранятся последовательно (упакованы).
Другой пример, где количество самолетов> 1: QVideoFrame::Format_YUV420P
Кадр сохраняется с использованием 8-разрядного для каждого компонента плоского формата YUV с подвыборкой плоскостей U и V по горизонтали и вертикали, т. Е. Высота и ширина плоскостей U и V вдвое меньше, чем у плоскости Y.
Это означает, что цветовые компоненты пикселя не упакованы вместе (как в Format_RGB32
), но каждая плоскость хранит только один цветовой компонент одного пикселя. Чтобы восстановить пиксель, соответствующие компоненты цвета должны быть прочитаны из каждой плоскости и объединены соответственно.
В случае, когда имеется несколько плоскостей, следует использовать 2 nd аромат bytesPerLine()
:
int QVideoFrame::bytesPerLine(int plane) const
Возвращает количество байтов в строке сканирования плоскости .
В случае вышеупомянутого QVideoFrame::Format_YUV420P
: U и V компонента по горизонтали и вертикали сэмплированы . То есть чтобы получить пиксель при (x, y) = (123, 72), компоненты должны быть прочитаны:
- Компонент Y со смещением
72 * getBytesPerLine(0) + 123
- U компонент со смещением
72 / 2 * getBytesPerLine(1) + 123 / 2
- В компонент по смещению
72 / 2 * getBytesPerLine(2) + 123 / 2
.