Монохромное растровое изображение (1 bbp) Заполнение и дополнительный байт 0xF0

Я работаю с монохромным растровым изображением, 1 бит на пиксель.

Когда я просматриваю файл в шестнадцатеричном редакторе, я замечаю, что каждая строка заканчивается следующей шестнадцатеричной последовательностью: f0 00 00 00.

Немного изучив проблему, я пришел к выводу, что три последних байта 00 00 00 соответствуют заполнению строки.

Вопрос 1:

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

if(((n_width % 32) == 0) || ((n_width % 32) > 24))
{
  n_nbPaddingBytes = 0;
}
else if((n_width % 32) <= 8)
{
  n_nbPaddingBytes = 3;
}
else if((n_width % 32) <= 16)
{
  n_nbPaddingBytes = 2;
}
else
{
  n_nbPaddingBytes = 1;
}

n_width — ширина в пикселях изображения BMP.

Например, если n_width = 100 пикселей, то n_nbPaddingBytes = 3.

Вопрос 2:

Помимо заполнения (00 00 00), у меня есть этот F0 байт, предшествующий трем байтам заполнения в каждой строке. В результате в правой части изображения появляется черная вертикальная линия шириной 4 пикселя.

Примечание 1. Я манипулирую изображением перед его печатью на принтере Zebra (я переворачиваю изображение по вертикали и меняю цвета: в основном черный пиксель становится белым и наоборот).

Примечание 2. Когда я открываю оригинальное изображение BMP с помощью Paint, у него нет такой черной вертикальной линии с правой стороны.

Есть ли причина, по которой этот байт 0xF0 присутствует в конце каждой строки?

Спасибо за помощь. С наилучшими пожеланиями.


person Léa Massiot    schedule 02.04.2015    source источник


Ответы (1)


Биты, представляющие пиксели растрового изображения, упакованы в строки. Размер каждой строки округляется до кратного 4 байтам (32-разрядное DWORD) путем заполнения.

RowSize = [(BitsPerPixel * ImageWidth + 31) / 32] * 4 (деление целое)

(формат файла BMP)

Монохромное изображение с шириной = 100 имеет размер строки 16 байт (128 бит), поэтому 3,5 байта служат для заполнения (второй полубайт F0 и 00 00 00). F представляет правые 4 столбца изображения (белый цвет для обычной палитры 0/1).

person MBo    schedule 02.04.2015
comment
Спасибо за ваш ответ. Действительно? Количество байтов для заполнения может быть числом с плавающей запятой? Итак, я предполагаю, что алгоритм, который я предлагаю, неверен, не так ли? - person Léa Massiot; 02.04.2015
comment
Нет, я считаю эффективные байты заполнения - ваши 100 пикселей занимают 100 бит = 12 1/2 байт, поэтому я написал около 3,5 - person MBo; 02.04.2015
comment
Байты на строку можно рассчитать следующим образом: (((biWidth + 31) & ~31) >> 3) для монохромного растрового изображения. Взято из здесь (см. шаг). - person urbanSoft; 13.01.2021
comment
@urbanSoft дает тот же результат - person MBo; 13.01.2021
comment
@MBo Я не утверждал обратного. :) Просто еще одна функция, на которую я наткнулся, потому что в данный момент занимаюсь тем же сабжем. - person urbanSoft; 14.01.2021