какая информация записана в заголовке файла формата bmp
Какая информация записана в заголовке файла формата bmp
Теперь мы знаем, как получить прямой доступ к поверхности и что делать с ее памятью, чтобы изменить значения отдельных пикселей. Давайте используем полученные знания на практике. В этой главе мы напишем приложение DirectDraw для просмотра графических файлов формата BMP. Но перед тем как браться за такую программу, необходимо научиться загружать BMP-файлы.
Формат BMP-файлов
BMP — стандартный формат графических файлов Windows. Подавляющее большинство BMP-файлов хранится без сжатия, что облегчает работу с ними. Даже в сжатых BMP-файлах нет ничего особенно сложного, но мы ограничимся файлами без сжатия.
BMP-файлы состоят из трех основных частей:
Заголовок содержит информацию о файле и находящемся в нем графическом изображении. Здесь хранятся параметры изображения (ширина, высота, глубина пикселей), а также количество цветов в нем.
Палитра присутствует только в BMP-файлах, содержащих палитровые изображения (с глубиной пикселей 8 бит и менее). К 8-битным изображениям прикладывается палитра, состоящая из не более чем 256 элементов.
Графические данные — это и есть само изображение. Формат этих данных зависит от глубины пикселей. Хотя BMP-файлы делятся на несколько типов, мы ограничимся 8-битными и 24-битными изображениями. 8-битные BMP-файлы будут использоваться для работы с 8-битными поверхностями, а 24-битные — для беспалитровых поверхностей. Хотя, по слухам, в природе существуют 16-битные и 32-битные BMP-файлы, они встречаются очень редко — например, мне таковые ни разу не попадались. Впрочем, это не имеет особого значения, так как 24-битную графику можно легко преобразовать в 16- или 32-битный формат.
Структура заголовка
Данные заголовка BMP-файла хранятся в двух структурах: BITMAPFILEHEADER и BITMAPINFOHEADER. Структура BITMAPFILEHEADER присутствует в начале любого BMP-файла и содержит информацию о самом файле. Для нас в этой структуре представляет интерес лишь одно поле — bfType, сигнатура BMP-файла (информацию об остальных полях можно найти в справочной системе Visual C++). В BMP-файлах это поле содержит буквы BM (обе буквы — прописные). По содержимому этого поля мы будем убеждаться в том, что выбранные файлы действительно имеют формат BMP.
Структура BITMAPINFOHEADER содержит информацию об изображении, хранящемся в BMP-файле. Эта структура объявляется так:
Первое поле, biSize, определяет размер структуры BITMAPINFOHEADER в байтах. Если ваша программа создает BMP-файл, это поле заполняется тривиально — достаточно определить размер структуры функцией sizeof. Однако при чтении BMP-файла по содержимому этого поля приходится рассчитывать позицию файла, на которой структура заголовка кончается. Эта мера обеспечивает обратную совместимость, благодаря ей Microsoft в будущем сможет увеличить размер структуры BITMAPINFOHEADER, не нарушая работы существующих приложений.
Лучше молчать и прослыть глупцом. Когда я только начал программировать для Windows, то не понимал, зачем в некоторые структуры включаются поля с их размерами. Забыв о мудром совете Авраама Линкольна, я высказался на эту тему в одной из ранних статей и был справедливо наказан. Впрочем, если бы все прислушались к совету Линкольна, никто бы не писал книг.
Поля biWidth, biHeight и biBitCount определяют размеры изображения. Содержимое поля biCompression позволяет узнать, хранится ли изображение в сжатом виде. Поскольку мы не собираемся работать со сжатыми BMP-файлами, необходимо проверить, имеет ли это поле значение BI_RGB (а не BI_RLE8, свидетельствующее о сжатии файла).
В поле biSizeImage хранится размер графических данных (в пикселях). Однако учтите, что это поле часто оказывается незаполненным (содержит нулевое значение). В таких случаях нам придется самостоятельно вычислять размер графических данных.
Наконец, поле biClrUsed определят количество цветов в палитре (для палитровых изображений). Как и поле biSizeImage, оно часто может быть равно нулю. Это означает, что палитра содержит максимальное количество элементов (256 для 8-битных изображений). Остальные поля структуры BITMAPINFOHEADER не представляют для нас интереса, поэтому я не стану утомлять вас их обсуждением.
Палитра
Палитра в BMP-файлах хранится в виде списка структур RGBQUAD, где каждый элемент представляет отдельный цвет. Структура RGBQUAD объявляется так:
В первых трех полях хранятся цветовые RGB-составляющие. На поле rgbReserved мы не будем обращать внимания (предполагается, что оно равно нулю). Как я упоминал выше, количество структур RGBQUAD в BMP-файле определяется полем biClrUsed. Тем не менее обычно 8-битные BMP-файлы содержат 256 структур RGBQUAD. В 24-битных RGB-файлах структуры RGBQUAD отсутствуют.
Графические данные
Графические данные в основном представляют собой список пикселей, из которых состоит изображение. Однако каждая горизонтальная строка пикселей должна занимать блок памяти, выровненный по границе параграфа. Следовательно, если количество байт, необходимых для хранения строки пикселей, не кратно четырем, в каждую строку включается от одного до трех дополняющих байт.
При этом для работы с графическими данными BMP-файлов используется концепция шага, упоминавшаяся выше в этой главе. Отличие состоит в том, что для графических данных BMP-файлов значение шага вам придется рассчитать самостоятельно. Впрочем, это не так уж сложно, потому что шаг всегда попадает на ближайшую границу параграфа за концом блока памяти, необходимого для хранения строки пикселей.
Изображения хранятся в BMP-файлах в перевернутом виде, так что первая строка пикселей файла на самом деле является нижней строкой настоящего изображения. Чтобы восстановить нормальное изображение, мы начнем чтение файла с последней строки пикселей и будем двигаться к началу.
Русские Блоги
Подробный формат BMP
Перепечатано из https://blog.csdn.net/u012877472/article/details/50272771
Вот краткое введение в формат BMP на конкретном примере.
1. Общая информация
Файлы в формате BMP выглядят следующим образом от начала до конца:
Ниже приводится подробное введение через следующие рисунки:
Часть информации об изображении выглядит следующим образом:
2. заголовок файла bmp
Заголовок файла bmp содержит следующую информацию:
индекс | синий | зеленый | красный | Alpha |
0 | 01 | 10 | 37 | 00 |
1 | 00 | 10 | 49 | 00 |
2 | 00 | 18 | 44 | 00 |
3 | 01 | 1D | 58 | 00 |
Тогда размер растровых данных:
В этом случае после сканирования строки данных последние несколько байтов могут быть заполнены 0, и их необходимо пропустить:
Интеллектуальная рекомендация
Анализ принципа группирующей функции BRVAH
Недавно я столкнулся с вопросом от одноклассника в сообществе DIYcode, поэтому я написал эту статью для анализаBRVAHРеализация группирующих функций. Если у вас есть какие-либо вопросы, вы можете задат.
Два случая значения обработчика и передачи сообщения
Стандарты набора персонала Unicorn Enterprise Heavy для Python-инженеров 2019 >>> Эффект программы: показать простой пример того, как использовать сообщение для передачи значений Пример 1. На.
Предварительное исследование использования Microsoft Chart Control MsChart
Шаблон проектирования Android-19-шаблон адаптера
1. Определение Определите класс-оболочку для обертывания объектов с несовместимыми интерфейсами Преобразуйте интерфейс класса в другой интерфейс, который нужен клиенту. Форма режима адаптера делится н.
Сертификат 1 + X для веб-разработки среднего уровня: примеры вопросов для теоретического экзамена
Русские Блоги
Подробное описание формата файла BMP
Поделитесь учебником по искусственному искусству моего учителя! Нулевой фундамент, легко понять!http://blog.csdn.net/jiangjunshow
Вы также можете перепечатать эту статью. Делитесь знаниями, приносите пользу людям и осознайте великое омоложение нашей китайской нации!
Вот краткое введение в формат BMP на конкретном примере.
1. Общая информация: файл растрового изображения можно рассматривать как состоящий из 4 частей:
(1). Заголовок растрового файла (заголовок растрового файла) Всего 14 байт
(2). Заголовок растровых данных (заголовок растровых данных), всего 40 байт.
(4). Определите байтовый массив растрового изображения, то есть данные растрового изображения
Наиболее распространенной является 24-битная карта. Так называемая 24-битная карта означает, что цветовая информация пикселя представлена 24 битами, то есть для трех основных цветов BRG каждый цвет представлен байтовыми (8) битами. В дополнение к 24-битным изображениям есть 1 бит (монохромный), 2 бита (4 цвета, CGA), 4 бита (16 цветов, VGA), 8 бит (256 цветов), 16 бит (расширенные цвета), 24 бита (правда) Цвет) и 32-битный.
(1). Это изображение, которое мы должны проанализировать на этот раз, мы используем WinHex, чтобы открыть этот файл, а затем проанализировать исходный код
Заголовок растрового файла (14 байт)
02H-05H (4 байта): размер всего файла выражается в байтах. Десятичное значение, соответствующее 0x00030038: 196664 байта. В настоящее время мы проверяем атрибуты файла, чтобы проверить:
Мы видим, что размер файла действительно составляет 196664 байта.
06H-09H (4 байта): зарезервированный бит, должен быть установлен в 0;
0AH-ODH (4 байта): объем данных от начала файла до начала данных растрового изображения, называемый смещением: размер смещения = Размер заголовка растрового файла + размер заголовка растровой информации + размер палитры.
Заголовок растрового изображения (40 байт)
0EH-11H (4 байта): длина заголовка битовой информации, проверьте его: десятичное значение, соответствующее 0x0028, равно 40, и проверка верна
12H-15H (4 байта): ширина растрового изображения (в пикселях), десятичное число, соответствующее 0x00000100, равно 256, а пиксель составляет 256 пикселей
16H-19H (4 байта): высота растрового изображения (в пикселях), 0x00000100 соответствует 256 десятичным цифрам, а размер пикселя составляет 256 пикселей. Это показывает, что ширина и высота растрового изображения составляют 256 пикселей, мы открываем свойства файла, чтобы проверить:
Убедитесь, что результаты верны.
1AH-1BH (2 байта): количество битовых плоскостей в битовой карте. (Примечание: значение всегда равно 1).
1CH-1DH (2 байта): количество бит каждого пикселя, как видно из рисунка выше, представляет собой 24-цветное растровое изображение. Согласно расчету, десятичное значение, соответствующее 0x0018, действительно равно 24.
Инструкции по сжатию:
0-нет сжатия (используйте BI_RGB)
1-RLE 8- Использовать 8-битное сжатие RLE (обозначается BI_RLE8)
2-RLE 4- Использовать 4-битный метод сжатия RLE (обозначается BI_RLE4)
Метод хранения 3-битовых полей (обозначается BI_BITFIELDS)
Картинка соответствует 0x00000000, тогда растровое изображение не сжимается.
22H-25H (4 байта): размер растровых данных в байтах. Это число должно быть кратным 4. Когда не сжато, его значение может быть 0. Размер растровых данных составляет 0x00030002, соответствующее десятичное число: 196610, плюс 54 байта в заголовке, что в точности соответствует размеру всего файла, 196664 байта.
26H-29H (4 байта): горизонтальное разрешение, выраженное в пикселях / метр.
2AH-2DH (4bytes) : Вертикальное разрешение в пикселях / метр.
2EH-31H (4 байта): количество цветов, используемых в файле. Если это 0, это означает, что используются все возможные цвета. Например, 8 бит / пиксель выражается как 0x100 или 256.
32H-35H (4 байта): укажите количество важных цветов. Когда значение этого поля равно количеству цветов (или равно 0), это означает, что все цвета одинаково важны.
палитра
Размер N * 4 (байты), где N представляет количество цветов. Для 24-битного изображения (истинный цвет) палитра отсутствует, давайте проверим, составляет ли смещение 54 байта, когда размер палитры равен 0, 0x00000036 соответствует 54 десятичному числу, что является правильным. Если число бит на пиксель не 24, а 8, соответствующее количество цветов N = 2 ^ 8 = 256, то размер палитры составляет 256 * 4 = 1024 байта.
Данные в палитре представляют собой группу из 4 байтов каждая, представляющую значения синего, зеленого, красного и альфа. по Пример изображения с 8 битами на пиксель Для:
1 байт для синего компонента, 1 байт для зеленого компонента, 1 байт для красного компонента и 1 байт для символа-заполнителя (установлен в 0).
Растровые данные
Размер этого поля зависит от метода сжатия, размера изображения и битовой глубины изображения. Он содержит все байты растровых данных. Эти данные могут быть номером индекса цветовой палитры или фактическим значением RGB. Он определяется в соответствии со значением битовой глубины в заголовке информации изображения.
Если это 8-битная цветовая карта, каждый пиксель представлен 1 байтом, и каждый байт вынимается и отображается на соответствующем устройстве.
Если это 24-битная цветовая карта, она размещается в порядке BGR, а 32-битная цветовая карта располагается в соответствии с BGRAlpha.
BPP : Бит на пиксель
Для приведенной выше картины БПП = 24, ширина = 256. Это кратно 32, поэтому нет дополнения. Но 54-байтовый заголовок файла должен быть заполнен 56.
Русские Блоги
Анализ формата файла BMP
Анализ формата файла BMP
Каталог статей
1. Обзор изображения
1.1 Растровое изображение
1.2 Вектор
1.3 Разница между растровым изображением и векторной диаграммой
Наиболее очевидная разница между растровым изображением и векторной диаграммой:Мозаика появится, когда растровое изображение будет увеличено, и качество изображения ухудшится; векторную графику можно бесконечно увеличивать без снижения качества изображения.
Источник изображения: Википедия
1.4 Как выразить цвет пикселей
Выберите растровое изображение и увеличьте масштаб до 3200% в PS, как вы можете видеть ниже:
Вы можете ясно видеть один за другим маленькие квадратики, которые являются пикселями.
Пиксель имеет определенное положение и значение цвета. Цвет каждого пикселя представлен комбинацией RGB или значением серого.
В этом разделе основное внимание уделяется тому, как представлять цвета.
По битовой глубине растровые изображения можно разделить на 1, 4, 8, 16, 24 и 32-битные изображения. Битовая глубина здесь относится к количеству битов, используемых для представления цвета пикселя. Если пиксель представлен одним битом цвета, его битовая глубина равна 1, если пиксель представлен четырьмя битами цвета, его битовая глубина равна 4 и так далее.
Если пиксели изображения8 битДля представления цвета эти восемь битов могут представлять 2 8 Цвета, 256. Такой образобычно(Есть исключения, я расскажу об этом ниже) называетсяОттенки серого, Потому что эти 256 цветов являются черным и белым серым (серый здесь означает 244 различных степени серого). Изображение в градациях серого выглядит следующим образом:
2. Формат файла BMP
2.1 Введение в BMP
Разрядность пикселей в изображениях формата BMP может быть 1, 4, 8, 24, 32, но обычные битовые глубины BMP по-прежнему равны 8 и 24.
Когда битовая глубина файла BMP равна 8, это не обязательно означает, что изображение в оттенках серого, как показано ниже:
Разрядность этого изображения составляет 8, но это не изображение в оттенках серого, мы его называемПсевдоцветная карта。
Следующее изображение представляет собой полноцветное изображение с битовой глубиной 24, которое можно использовать для сравнения:
Видно, что качество изображения в истинных цветах значительно выше, чем у изображения в ложных цветах.
2.2 Составление формата файла BMP
Файл BMP состоит из следующих четырех частей:
Поскольку таблица цветов не обязательно существует, добавьте * Описание.
Кратко объясним информацию о каждой части ниже:
2.2.1 Заголовок растрового файла
Используется для описания состояния всего файла BMP, включая такую информацию, как тип, размер файла и начальная позиция растрового изображения файла BMP.
Заголовок файла растрового изображения имеет в общей сложности14 байт。
2.2.2 Заголовок информации о растровом изображении
Используется для описания такой информации, как размер растрового изображения.
Общий заголовок информации о растровом изображении40 байт。
2.2.3 Таблица цветов
Он используется для описания цвета в растровом изображении.Он имеет несколько элементов таблицы.Каждый элемент таблицы представляет собой структуру типа RGBQUAD, которая определяет цвет.
Вы можете видеть, что запись в таблице RGB4 байта。
Количество данных структуры RGBQUAD в таблице цветов определяется заголовком информации о битовой карте.biBitCountЧтобы убедиться:
2.2.4 Массив пикселей
Когда biBitCount = 1, 8 пикселей занимают 1 байт;
Когда biBitCount = 4, 2 пикселя занимают 1 байт;
Когда biBitCount = 8, 1 пиксель занимает 1 байт;
Когда biBitCount = 24, 1 пиксель занимает 3 байта: R, G, B;
Windows оговаривает, что количество байтов, занимаемых строкой сканирования, должно быть кратно 4 (то есть в единицах длины), и если этого недостаточно, оно заполняется 0.
Три, пример формата файла BMP анализа
Это необходимо для отображения информации об изображении в шестнадцатеричной форме, шестнадцатеричное число занимает 4 бита, поэтому одна строка представляет шестнадцать байтов.
Прежде чем анализировать файл BMP, мы должны сначала понять порядок хранения данных:
В файле BMP, если часть данных должна быть представлена несколькими байтами, порядок байтов данных следующий: «младший адрес для хранения младших данных и высокий адрес для хранения высоких данных». Например, порядок хранения данных 0x1756 в памяти:
3.1 Заголовок растрового файла
Первые два байта (0, 1) указывают тип файла растрового изображения, а именно 0x4d42 Представляет тип BMP, который совпадает с Первые два байта в DUMP обозначают один и тот же символ BM. 。
Следующие четыре байта (2, 3, 4, 5) указывают размер файла растрового изображения, а именно 0x0000c436 Представляет размер файла точечного рисунка, преобразованного в десятичное значение 50230, мы открываем свойства grey8.bmp и обнаруживаем, что его размер действительно составляет 50230 байт:
3.2 Заголовок информации о растровом изображении
Первые четыре байта (e, f в первой строке, 0, 1 во второй строке) представляют количество байтов, занятых заголовком информации о битовой карте, то есть 0x00000028, что при преобразовании в десятичное число равно 40;
Последние четыре байта (e, f во второй строке, 0, 1 в третьей строке) указывают тип сжатия битовой карты, и его значение равно 0x00000000, то есть без сжатия.
Последние четыре байта (6, 7, 8, 9 в третьей строке) представляют горизонтальное разрешение растрового изображения, и его значение равно 0x00002e23.
Последние четыре байта (a, b, c, d в третьей строке) представляют разрешение битовой карты по вертикали, и его значение равно 0x00002e23.
Последние четыре байта (2, 3, 4, 5 в четвертой строке) представляют количество важных цветов в процессе отображения растрового изображения, и его значение равно 0x00000000, как правило, равному 0.
3.3 Таблица цветов
Когда битовая глубина равна 24, таблица цветов отсутствует, а за заголовком информации о растровом изображении следует массив пикселей;
Когда битовая глубина не 24, есть таблица цветов, а есть 2 Битовая глубина Каждый элемент таблицы цветов занимает 4 байта.
В желтом поле, как показано на рисунке ниже, находится 256 элементов таблицы цветов с общим размером 256 * 4 байта (показана только его часть):
Поскольку каждый элемент таблицы цветов занимает 4 байта, мы делим элемент таблицы цветов на один элемент таблицы цветов, то есть черный ящик, в единицах по 4 байта.
Поскольку grey8.bmp является изображением в градациях серого, элементы его таблицы цветов основаны на правилах.
В записи таблицы цветов три компонента RGB равны, а четвертый компонент равен 0; во всей таблице цветов значение первых трех компонентов записи таблицы цветов увеличивается на 1 от 0 до 255. Фактически, rgb (0,0,0) представляет черный, rgb (255,255,255) представляет белый, rgb (x, x, x) (x не равно 0 или 255, x является целым числом от 0 до 255) представляет разные градусов серого.
3.4 Массив пикселей
После таблицы цветов (или заголовка информации о растровом изображении) идет массив пикселей. В этом примере битовая глубина равна 8, поэтому один байт представляет один пиксель. Как определить цвет этого пикселя? Диапазон одного байта составляет [0,255], теперь вы должны понять! Найдите соответствующий элемент таблицы цветов в соответствии со значением этого байта, и цвет, соответствующий этому элементу таблицы цветов, является цветом этого пикселя. Вот как это работает для BMP с таблицами цветов.
Для изображения с истинным цветом его битовая глубина равна 24, и один пиксель, естественно, соответствует трем цветовым компонентам R, G и B, поэтому нет необходимости в таблице цветов, а для изображения с истинным цветом, если есть таблица цветов, то есть более чем 16 миллионов элементов таблицы цветов, весь файл будет очень большим.
Три, эксперимент с кодом
3.1 Экспериментальная среда
3.2 Содержание эксперимента
Измените элементы таблицы цветов изображения в градациях серого gray8_test.bmp ниже на случайные значения и превратите исходное изображение в оттенках серого в псевдоцветное изображение.
3.3 Другая информация
Три структуры BITMAPFILEHEADER, BITMAPINFOHEADER и RGBQUAD находятся вwindows.hОпределено в
3.4 Код ключа
Поскольку код имеет подробные комментарии, он не будет здесь подробно объяснен.
3.6 Результаты
С помощью нашей программы генерируются следующие картинки, которые довольно красивы!
3.7 Полный код
Четыре, расширенный эксперимент
Примечания: Формула преобразования из RGB в шкалу серого: Серый = R * 0,299 + G * 0,587 + B * 0,114
Пять, справочные материалы
[2] Мультимедийные материалы по базовому курсу
[3] Введение в Википедии о «растровом изображении», «векторной диаграмме» и «формате BMP»