Расширение имени файла bmp. BMP-формат файла: описание расширения. Внутреннее строение и расширение

Современный человек часто работает с цифровыми изображениями различного формата. Они используются в Интернете, на компьютере, на смартфоне, в цифровом фотоаппарате, в экшн-камерах и других устройствах. Но есть один формат, который способен поставить в тупик некоторых пользователей - BMP. Это не особо распространенный тип изображений (по крайней мере, в наше время), но его все еще можно встретить. Поэтому неплохо было бы понять, что он из себя представляет. Попытаемся ответить на вопрос о том, что собой представляет формат BMP. Но сначала надо бы рассказать об истории его возникновения. Это поможет понять, зачем вообще он был создан. Итак, начнем с истории создания формата BMP.

Предыстория

Примерно в 1994 году разработчикам понадобился новый формат изображений, для использования в программных продуктах. Критерии были поставлены жесткие. Формат должен был работать с 256-цветной палитрой, обладать вменяемым размером. В скором времени был представлен формат BMP. Это было настоящим прорывом на то время. Он массово использовался практически везде. Даже в компании "Майкрософт", которая его и разработала.

Однако шли года, и данный формат перестал быть востребованным. Появились куда более продвинутые технологии компрессии. При этом качество цвета у новых форматов было куда лучше. Теперь BMP используется только в некоторых программах. Да и то, только в тех, разработчики которых не "заморачивались" на интерфейсе, например, ОС "Виндовс". Файл BMP безнадежно устарел. Но его почему-то все еще используют. А теперь попытаемся понять, что же это за зверь.

Что такое BMP?

BMP - это тип файла для хранения растровых изображений. Только растровых. Векторная графика не для этого формата. Особенностью данного формата является то, что он не использует никакого механизма сжатия. Теоретически, он должен обеспечивать высочайшее качество изображения. Но беда в том, что размер такого изображения будет просто гигантским. Именно поэтому данный формат растрового изображения и потерял популярность. Началось падение BMP с олимпа после появления PNG. Этот формат позволял не только сохранить изображение высокого качества при маленьком размере, но и можно было работать со слоями, что весьма важно в современном мире.

Однако пока еще BMP File существует и используется. Поэтому пользователям важно знать, чем можно открыть такие файлы и как сконвертировать его в более удобные форматы. Вот это сейчас и обсудим. Сразу стоит сказать, что таких программ великое множество. И все они способны адекватно работать с данным форматом, так как он довольно старый. Но вот в конвертации есть свои нюансы, о которых стоит упомянуть.

Чем открыть BMP

На данный момент с этой задачей может справиться более или менее продвинутый просмотрщик графических файлов. Как ни странно, даже стандартный вьювер "Виндовс" может открыть данный формат, хоть и с жуткими тормозами. Но лучше всего с этой задачей справляется FS Image Viewer и ACDSee. Такие продвинутые продукты, как "Фотошоп" и редакторы от "Корел" также способны работать с файлами данного формата. А вообще, все современные просмотрщики способны читать данный формат, так как он довольно-таки старый.

Однако все вышеперечисленное касается только операционных систем семейства "Виндовс". А как открыть файл BMP в "Линукс" или "Мак ОС"? Там есть специализированные программные продукты, поддерживающие данный формат. И их немало. Так что проблем не возникнет. А "Мак ОС" еще и поддерживает "Фотошоп", который и вовсе является всеядным. В довесок к остальным мультимедийным программам.

Конвертирование BMP

Как конвертировать BMP в JPG или какой-либо другой более привычный формат? Все зависит от того, какое качество картинки требуется на выходе. Если потери должны быть минимальными, то лучше использовать для этих целей "Фотошоп" или что-то равнозначное. Только "Фотошоп" позволяет сохранить изображение без потери качества. А если использовать для сохранения форматы PNG или PSD, то можно сохранить еще и слои. Если же качество не имеет значения, то можно использовать любой конвертер. Практически все они поддерживают конвертацию в JPEG, PNG, BMP и другие популярные форматы.

И опять же, выше были перечислены исключительно программы под "Виндовс". В "Линукс" или "Мак ОС" дела с конвертированием обстоят несколько иначе. В системе от Apple есть поддержка "Фотошопа", так что быстро перегнать изображение BMP в другой формат без потери качества не составляет проблемы. А вот в "Линукс" приходится пользоваться разнообразными конвертерами, которые часто не в состоянии обеспечить максимальное качество.

Для чего может использоваться этот формат?

Хоть формат BMP и устарел морально, но он все равно может использоваться в некоторых случаях. Достаточно того факта, что весь интерфейс "Виндовс" основан на данном растровом формате. Почему так? Потому, что использовать BMP очень удобно. Он обладает хорошей цветностью и полным отсутствием компрессии. Также изображения в этом формате можно редактировать какое угодно количество раз. И качество ничуть не пострадает. В отличие от того же JPEG. Как раз этим и объясняется живучесть этого формата. Многие разработчики программ под "Виндовс" также активно используют изображения BMP в своих продуктах.

Еще одна область применения формата - БИОСы компьютеров. Некоторые из них имеют весьма неплохие картинки (они могут включать в себя лого производителя, некоторые элементы интерфейса и прочее). Все они сделаны в формате BMP. Растровые изображения такого плана отлично показывают себя в системах без адекватного графического интерфейса. Потому они и используются в БИОСах.

Размер

Стоит отметить, что хорошая картинка в формате BMP будет "весить" немало. Все дело в том, что данный файловый формат не использует сжатие. Потому и размер не может быть уменьшен. К примеру, качественная фотография с разрешением 1280 на 720 точек будет иметь размер около 300 мегабайт. Такова особенность данного формата.

Внутреннее строение и расширение

Строение файла BMP можно описать так: это однослойное изображение растрового типа с приличной плотностью и хорошей цветопередачей. В этом и заключается главный недостаток формата - он не может использовать дополнительные слои. Потому они был вытеснен в "вебе" более продвинутыми форматами, поддерживающими многослойность.

Заключение

Итак, мы рассмотрели старый, но еще кое-где применяемый формат BMP. Это формат растровых изображений, который может похвастаться отсутствием всякой компрессии и совместимостью практически со всеми программами как просмотрщиками, так и редакторами. Он может применяться в современных программах для обеспечения работы интерфейса. А в операционной системе "Виндовс" он широко используется и по сей день. Конвертировать этот формат в какой-нибудь другой не составляет никакого труда. Для этого имеется огромное количество соответствующего софта. И не только под "Виндовс". В общем, сей формат еще будет жить, несмотря на появление более продвинутых и качественных.

При наличии на компьютере установленной антивирусной программы можносканировать все файлы на компьютере, а также каждый файл в отдельности . Можно выполнить сканирование любого файла, щелкнув правой кнопкой мыши на файл и выбрав соответствующую опцию для выполнения проверки файла на наличие вирусов.

Например, на данном рисунке выделен файл my-file.bmp , далее необходимо щелкнуть правой кнопкой мыши по этому файлу, и в меню файла выбрать опцию «сканировать с помощью AVG» . При выборе данного параметра откроется AVG Antivirus, который выполнит проверку данного файла на наличие вирусов.


Иногда ошибка может возникнуть в результате неверной установки программного обеспечения , что может быть связано с проблемой, возникшей в процессе установки. Это может помешать вашей операционной системе связать ваш файл BMP с правильным прикладным программным средством , оказывая влияние на так называемые «ассоциации расширений файлов» .

Иногда простая переустановка Adobe Illustrator CC может решить вашу проблему, правильно связав BMP с Adobe Illustrator CC. В других случаях проблемы с файловыми ассоциациями могут возникнуть в результате плохого программирования программного обеспечения разработчиком, и вам может потребоваться связаться с разработчиком для получения дополнительной помощи.


Совет: Попробуйте обновить Adobe Illustrator CC до последней версии, чтобы убедиться, что установлены последние исправления и обновления.


Это может показаться слишком очевидным, но зачастую непосредственно сам файл BMP может являться причиной проблемы . Если вы получили файл через вложение электронной почты или загрузили его с веб-сайта, и процесс загрузки был прерван (например, отключение питания или по другой причине), файл может повредиться . Если возможно, попробуйте получить новую копию файла BMP и попытайтесь открыть его снова.


Осторожно: Поврежденный файл может повлечь за собой возникновение сопутствующего ущерба предыдущей или уже существующей вредоносной программы на вашем ПК, поэтому очень важно, чтобы на вашем компьютере постоянно работал обновленный антивирус.


Если ваш файл BMP связан с аппаратным обеспечением на вашем компьютере , чтобы открыть файл вам может потребоваться обновить драйверы устройств , связанных с этим оборудованием.

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


Совет: Если при попытке открыть файл BMP вы получаете сообщение об ошибке, связанной с.SYS file , проблема, вероятно, может быть связана с поврежденными или устаревшими драйверами устройств , которые необходимо обновить. Данный процесс можно облегчить посредством использования программного обеспечения для обновления драйверов, такого как DriverDoc .


Если шаги не решили проблему , и у вас все еще возникают проблемы с открытием файлов BMP, это может быть связано с отсутствием доступных системных ресурсов . Для некоторых версий файлов BMP могут потребоваться значительный объем ресурсов (например, память/ОЗУ, вычислительная мощность) для надлежащего открытия на вашем компьютере. Такая проблема встречается достаточно часто, если вы используете достаточно старое компьютерное аппаратное обеспечение и одновременно гораздо более новую операционную систему.

Такая проблема может возникнуть, когда компьютеру трудно справиться с заданием, так как операционная система (и другие службы, работающие в фоновом режиме) могут потреблять слишком много ресурсов для открытия файла BMP . Попробуйте закрыть все приложения на вашем ПК, прежде чем открывать Bitmap Image File. Освободив все доступные ресурсы на вашем компьютере вы обеспечите налучшие условия для попытки открыть файл BMP.


Если вы выполнили все описанные выше шаги , а ваш файл BMP по-прежнему не открывается, может потребоваться выполнить обновление оборудования . В большинстве случаев, даже при использовании старых версий оборудования, вычислительная мощность может по-прежнему быть более чем достаточной для большинства пользовательских приложений (если вы не выполняете много ресурсоемкой работы процессора, такой как 3D-рендеринг, финансовое/научное моделирование или интенсивная мультимедийная работа). Таким образом, вполне вероятно, что вашему компьютеру не хватает необходимого объема памяти (чаще называемой «ОЗУ», или оперативной памятью) для выполнения задачи открытия файла.

О том, как спрятать текст в bitmap-изображении. К сожалению, топиков на эту тему я не нашел и решил восполнить данный пробел. Под катом Вы найдете способ сокрытия текста в bitmap"е, а также реализацию на C#.

Постановка задачи

Спрятать произвольный текст в кодировке windows-1251 в 24-разрядный bitmap рисунок и излвечь его обратно без искажений.

Структура bmp-файла

Для начала напомню, что из себя представляет bitmap-файл. Я уверен, что Вы все это прекрасно знаете, просто будет нагляднее описывать алгоритм сокрытия текста на базе изложенного материала. И так. Любой bmp-файла состоит из четырех частей:
  1. Заголовок файла
  2. Заголовок изображения (может отсутствовать)
  3. Палитра (может отсутствовать)
  4. Само изображение
Заголовок файла содержит служебную информацию, в том числе разрядность рисунка. Кстати, для 24-разрядного рисунка палитра не используется. По скольку мы в задании четко обозначили, что будем работать только с 24-разрядными изображениями, то в идеале можно проверить входное изображение на соответствие требованиям.
Теперь перейдем, непосредственно, к самому изображению. Как Вам известно, формат bmp по умолчанию не предусматривает сжатие (хотя есть поддержка сжатия по алгоритму RLE). Таким образом каждый пиксел в нашем случае кодируется 24 битами, по байту на каждую компоненту цвета. Следовательно, мы можем закодировать ни больше ни меньше, а ровно 16777216 цветов. Для наглядности приведу рисунок:

Идея алгоритма сокрытия текста

Наверное, Вы уже догадались в чем идея. Дело все в том, что глаз среднестатистического человека (не профессионального художника или фотографа) различает намного меньше цветов, чем было указано выше. Ни в одной книге нет четкого ответа на вопрос, сколько все же цветов различает глаз, но самая большая цифра, которую я встретил - 10 млн. Отсюда следует, что несколько младших битов из восьми, отводимых на каждую компоненту цвета, можно позаимствовать для наших корыстных целей.
Немного цифр: для примера возьмем и нагло отнимем у RGB компонент по два младщих бита. То есть из 24 бит у нас останется 18, которыми можно закодировать ровно 262144 цветов. Теперь возьмем текст в кодировке windows-1251, в которой каждый символ представляется 8ю битами. Путем несложных математический вычислений получаем, что 3 символа можно сохранить в 4 пикселах. Таким образом, в картинке 1024x768, где 786432 пикселов можно сохранить 589824 символа. Неплохо, да? Для наглядности приведу две картинки. На первой исходное изображение, а на второй изображение, у которого младшие два бита каждой компоненты цвета заполнены текстом. Сразу оговорюсь, что изображения сконвертированы в png, чтобы пожалеть траффик.

Исходное изображение:


Изображение, содержащее текст


Если приглядется, то на втором изображении цвета кажутся тусклее. Да, это так. Но мы то с Вами знаем, что в представленном изображении что-то не так, а если бы не знали, то и не догадались бы, что в нем спрятан какой-то текст. Кстати, в изображении спрятана фраза «Hello World!!! =)» размноженная 100 раз.
Вот и все. Как Вы видите, идея предельно проста. Кстати говоря, представленный метод называется LSB (спасибо frol за подсказку). Напоследок, можете посмотреть реализацию на языке C#.

Реализация на C#

Представленная реализация не претендует на награду в стиле «Совершенный код», она лишь демонстрирует описанный алгоритм на практике. В данном случае я гнался не за красотой кода, а за наглядностью.

Очень часто при работе с графикой многие пользователи сталкиваются с изображениями в формате BMP. Сегодня мало кто знает, что это такое. Сейчас мы рассмотрим графический формат BMP более подробно. Более того, мы не только отследим историю его возникновения и эволюцию, но и предложим некоторые простейшие методы его преобразования в другие популярные форматы.

Что такое BMP-формат?

Не будем особенно вдаваться в технические подробности. Отметим, что BMP является форматом хранения графических изображений в виде точечного рисунка на основе однослойных растров.

Да, это действительно так. Изначально формат изображения BMP применялся исключительно к растровым картинкам и был универсальным (стандартным) расширением для всей графики вообще.

История возникновения

История создания этого формата неразрывно связана с корпорацией Microsoft, которая впервые реализовала его в своем главном детище - операционной системе Windows. Кроме того, несмотря на постоянную конкуренцию с Apple, поддержка графики такого типа позже была заявлена для операционки OS/2.

Правда, с тех пор BMP-формат графики претерпел множество изменений. Изначально предполагалось, что структура изображения строится на сочетании маленьких квадратиков, сегодня известных под названием пикселей. Считается, что каждый пиксель изображения может содержать данные о различной глубине цвета (количество бит на одну такую графическую единицу). Значения, используемые для указания битности цвета, выглядят как следующий ряд: 1, 2, 4, 8, 16, 24, 32, 48, 64 бита.

При этом для значений меньше 8 цвет указывается только с использованием индекса палитры (таблицы) оттенков, а для значений выше индекс берется из стандартной модели RGB. Последняя содержит вариации цветов, получаемые на основе смешивания красного, зеленого и синего.

Как уже понятно, чем выше битность, тем большим будет размер конечной картинки. Надо сказать, что формат файла BMP и в те далекие времена, и сегодня выглядит неким мастодонтом, ведь его размер достаточно большой. Связано это с тем, что само изображение является несжатым, по сравнению, допустим, с тем же форматом JPG. По размеру файлы с разными типами расширения, содержащие одно и то же изображение, могут отличаться не то что в сотни - в десятки тысяч раз.

Чем открыть формат файла BMP?

Что касается открытия изображений такого типа, любая операционка Windows имеет встроенные средства для этого.

Пока еще не были созданы приложения для просмотра, основным средством редактирования оставалась родная программа Paint, входящая в состав любой версии Windows. Тогда это приложение поддерживало исключительно BMP-формат.

Как уже понятно, с развитием технологий и эволюцией самого формата изменялась и программа. Сегодня возможности Paint намного выше, чем у начальных его версий.

Кроме того, с появлением программ для просмотра и редактирования графики формат файла BMP был заявлен в технической поддержке и в них. Неудивительно, ведь именно он явился «прадедом» практически всех известных сегодня расширений файлов изображений.

Программ для работы с такими графическими данными можно найти очень много. Среди средств просмотра, к примеру, в Windows можно использовать стандартное средство, среди сторонних приложений достаточно популярными являются программные пакеты типа ACDSee или Irfan View и многие другие.

Что касается редактирования, для работы можно применять все, что угодно, например, те же Adobe Photoshop, Corel Draw или любой другой графический редактор, имеющий даже минимальный набор инструментов и возможностей.

Простейший способ преобразования формата BMP

Теперь посмотрим, как изменить формат BMP простейшими способами. Для этого можно использовать все те же графические редакторы.

Если взять в пример стандартное приложение Paint, сначала в нем открывается искомый файл BMP, после чего из меню «Файл» выбирается команда «Сохранить как…», где в корне, в нижней строке (выпадающее меню) можно найти поддерживаемые форматы.

Собственно, в любом другом графическом редакторе технология преобразования точечного рисунка аналогична выше описанной. В некоторых приложениях можно найти и команды экспорта, которые, в принципе, ничем особо и не отличаются, поскольку при их использовании вся процедура опять же сводится только к выбору другого поддерживаемого графического формата, отличного от изначального BMP.

Использование конвертеров

Одним из самых простых способов, позволяющих перевести в формат BMP картинку другого типа, не говоря уже об использовании стандартных средств Windows и графических редакторов, является применение специализированных конвертеров, которые работают в автоматическом режиме.

Тут все просто. Пользователь добавляет графические файлы, подлежащие преобразованию, в окно программы, после чего выбирает конечный формат (в данном случае BMP) и нажимает кнопку старта процесса конвертирования. Конечные файлы в новом виде будут сохранены в папке, местоположение которой установлено в приложении по умолчанию или задано вручную.

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

При всем множестве программ такого направления в Интернете можно найти немало ресурсов, позволяющих осуществлять такие преобразования в режиме онлайн. Только в данном случае пользователь загружает файлы на сайт, выбирает конечный формат, после чего скачивает результат себе на компьютер. Согласитесь, по сравнению с первыми двумя способами, не очень удобно.

Заключение

Вот вкратце и все, что можно сказать о формате графики BMP. По понятным причинам техническая сторона вопроса в плане структуры файла не рассматривалась. Рядовому юзеру такие данные вряд ли что-то скажут.

Но вот в заключение хотелось бы добавить несколько слов о преобразовании графических файлов именно в несжатый формат BMP. Конечно, его нынешний вариант занимает меньше места на диске. Но все равно он отличается от более современных сжатых типов данных. В принципе, сам формат BMP можно назвать даже несколько устаревшим, поскольку сегодня его мало кто использует. Поэтому преобразование сжатых форматов в тип графических файлов с расширением.bmp на современном этапе кажется явно нецелесообразным.

Эта статья про то, как выглядит графический формат bmp. Хоть это и один из простых форматов, но из-за того, что существует много вариаций этого формата, то не все моменты очевидны. Итак, хватит лить воду, начнем.

Структуры формата

Формат bmp (от слов BitMaP - битовая карта, или, говоря по-русски, битовый массив) представляет из себя несжатое (в основном) изображение, которое довольно легко читается и выводится в ОС Windows, в которой есть специальные функции API, которые в этом помогают.

Для начала приведем графическое представление данных в bmp (картинка взята из MSDN).

В начале стоит заголовок файла (BITMAPFILEHEADER). Он описан следующим образом:

bfType определяет тип файла. Здесь он должен быть BM. Если Вы откроете любой файл BMP в текстовом (а лучше в 16-ричном редакторе), то увидите, что первые два символа - это BM (от слова BitMap, как вы уже, наверное, догадались).
bfSize - это размер самого файла в байтах. Строго говоря вы должны его высчитывать (что рекомендуется), но я ставил размер файла неправильно (правда, не нарочно:)) и никаких проблем не было (ACDSee читало без проблем, моя программа работала), но я вам не рекомендую писать его заведомо неправильно, вдруг появится добросовестная программа, которая сверит этот размер с настоящим и решит, что это не bmp, а что-нибудь другое. В идеале все программы для того, чтобы убедиться, что перед ними действительно bmp, а не подделка, должны, во-первых, проверить, что bfType содержит "BM" (без кавычек), а, во-вторых, что bfSize равен размеру файла.
bfReserved1 и bfReserved2 зарезервированы и должны быть нулями.
bfOffBits . Это один из самых важных полей в этой структуре. Он показывает, где начинается сам битовый массив относительно начала файла (или, как написано в MSDN, "от начала структуры BITMAPFILEHEADER"), который и описывает картинку. То есть, чтобы гарантированно попадать на начало массива вы должны писать:

typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, * PBITMAPINFOHEADER;

biSize - это размер самой структуры. Ее нужно инициализировать следующим образом: bih.biSize = sizeof (BITMAPINFOHEADER);
Снова здесь и дальше будем считать, что bih объявлена следующим образом: BITMAPINFOHEADER bih;
biWidth и biHeight задают соответственно ширину и высоту картинки в пикселях.
biPlanes задает количество плоскостей. Пока оно всегда устанавливается в 1.
biBitCount - Количество бит на один пиксель. Подробнее про это поговорим ниже.
biCompression обозначает тип сжатия. Не удивляйтесь и не пугайтесь, что в bmp и вдруг сжатие. Я лично не видел не одной сжатой bmp (но я не говорю, что таких не существует). Если сжатия нет, то этот флаг надо устанавливать в BI_RGB. В этой статье мы говорим про несжатый формат, поэтому другие флаги я даже не буду перечислять. Похоже, что эта же структура используется и в файлах JPEG и PNG, потому что, начиная с Windows 98 тут появились варианты BI_JPEG, которая показывает, что эта картинка - JPEG и BI_PNG, что это PNG (про формат Jpeg я ничего не знаю, я только сделал эти выводы исходя из того, что написано в MSDN).
biSizeImage обозначает размер картинки в байтах. Если изображение несжато (то есть предыдущее поле установлено в BI_RGB), то здесь должен быть записан ноль. biXPelsPerMeter и biYPelsPerMeter обозначают соответственно горизонтальное и вертикальное разрешение (в пикселях на метр) конечного устройства, на которое будет выводиться битовый массив (растр). Приложение может использовать это значение для того, чтобы выбирать из группы ресурсов наиболее подходящий битовый массив для нужного устройства. Дело в том, что формат bmp - это по сути аппаратно-независимый растр, то есть когда внешний вид того, что получается не зависит от того, на что этот растр проецируется (если можно так выразится). Например, картинка будет выглядеть одинаково вне зависимости от того, рисуется она на экране монитора или печатается на принтере. Но вот разрешение у устройств разное, и именно для того, чтобы выбрать наиболее подходящую картинку из имеющихся и используют эти параметры.
biClrUsed определяет количество используемых цветов из таблицы. Если это значение равно нулю, то в растре используется максимально возможное количество цветов, которые разрешены значением biBitCount. Это актуально только для сжатых картинок. Если biClrUsed не нуль и biBitCount меньше 16, то biClrUsed определяет текущее число цветов графического движка или доступного драйвера устройства. Если biBitCount больше или равно 16, то biClrUsed определяет размер таблицы цветов, используемой для оптимизации текущей системной палитры.
biClrImportant - это количество важных цветов. Определяет число цветов, которые необходимы для того, чтобы изобразить рисунок. Если это значение равно 0 (как это обычно и бывает), то все цвета считаются важными.

Виды формата BMP

Все разновидности формата bmp условно можно разделить на два типа: палитровые и беспалитровые. То есть используется в данном с формате палитра или нет. Заметьте, что палитра может быть даже в беспалитровых форматах, только там она не используется. В беспалитровых bmp цвет высчитывается прямо из тех битов, которые идут в файле, начиная с некоторого места. А в палитровых каждый байт описывает один или несколько пикселей, причем значения байта (или битов) - это индекс цвета в палитре. Для начала приведу таблицу, которая сравнивает возможные варианты. Вид картинки (палитровая или беспалитровая) зависит от того, сколько бит отдается на один пиксель, то есть от значения biBitCount структуры BITMAPINFOHEADER.

biBitCount Палитровый или беспалитровый формат Максимально возможное количество цветов Примечания 1 Палитровый 2 Двуцветная, заметьте, не обязательно черно-белая, палитровая картинка. Если бит растра (что это такое чуть ниже) сброшен (равен 0), то это значит, что на этом месте должен быть первый цвет из палитры, а если установлен (равен 1), то второй. 4 Палитровый 16 Каждый байт описывает 2 пикселя. Вот пример из MSDN .Если первый байт в картинке 0x1F, то он соответствует двум пикселям, цвет первого - второй цвет из палитры (потому что отсчет идет от нуля), а второй пиксель - 16-й цвет палитры. 8 Палитровый 256 Один из самых распространенных вариантов. Но в то же время и самых простых. Палитра занимает один килобайт (но на это лучше не рассчитывать). Один байт - это один цвет. Причем его значение - это номер цвета в палитре. 16 Беспалитровый 2^16 или 2^15 Это самый запутанный вариант. Начнем с того, что он беспалитровый, то есть каждые два байта (одно слово WORD) в растре однозначно определяют один пиксель. Но вот что получается: битов-то 16, а компонентов цветов - 3 (Красный, Зеленый, Синий). А 16 никак на 3 делиться не хочет. Поэтому здесь есть два варианта. Первый - использовать не 16, а 15 битов, тогда на каждую компоненту цвета выходит по 5 бит. Таким образом мы можем использовать максимум 2^15 = 32768 цветов и получается тройка R-G-B = 5-5-5. Но тогда за зря теряется целый бит из 16. Но так уж случилось, что наши глаза среди всех цветов лучше воспринимают зеленый цвет, поэтому и решили этот один бит отдавать на зеленую компоненту, то есть тогда получается тройка R-G-B = 5-6-5, и теперь мы может использовать 2^16 = 65536 цветов. Но что самое неприятное, что используют оба варианта. В MSDN предлагают для того, чтобы различать сколько же цветов используется, заполнять этим значением поле biClrUsed из структуры BITMAPINFOHEADER. Чтобы выделить каждую компоненту надо использовать следующие маски. Для формата 5-5-5: 0x001F для синей компоненты, 0x03E0 для зеленой и 0x7C00 для красной. Для формата 5-6-5: 0x001F - синяя, 0x07E0 - зеленая и 0xF800 красная компоненты соответственно. 24 Беспалитровый 2^24 А это самый простой формат. Здесь 3 байта определяют 3 компоненты цвета. То есть по компоненте на байт. Просто читаем по структуре RGBTRIPLE и используем его поля rgbtBlue, rgbtGreen, rgbtRed. Они идут именно в таком порядке. 32 Беспалитровый 2^32 Здесь 4 байта определяют 3 компоненты. Но, правда, один байт не используется. Его можно отдать, например, для альфа-канала (прозрачности). Читать растр в данном случае удобно структурами RGBQUAD, которая описана так:

Хранение данных в формате bmp

Ну вот и подошли к самому интересному. После структур BITMAPFILEHEADER и BITMAPINFOHEADER идет палитра. Причем, если формат беспалитровый, то ее может и не быть, однако, на это рассчитывать не надо. Дело в том, что, когда я только начинал разбираться с форматом bmp, в одной книжке я вычитал, что, якобы, если формат беспалитровый, то у нее вообще нет палитры. Там даже были две картинки - схемы формата: одна с палитрой, другая без. А я в это время писал программу, которая усердно оперирует с bmp-шками. И мне надо было преобразовывать входящие картинки из 256 цветов в 24-битные (если таковые имелись) во временные файлы. И я в 24-битных палитру просто не создавал (bfOffBits из структуры BITMAPFILEHEADER у меня был равен сумме sizeof(BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER), а входящие 24-разрядные оставлял без изменений. С 256-цветными растрами все работало как надо, пока мне не попалась 24-разрядная картинка, у которой внизу вместо нужной части отображался мусор. Я не сразу понял в чем дело. Пока не сравнил размер исходного файла с теоретическим, который должен был быть, не будь палитры. Разница оказалась ровно 1 Kб (ровно 1024 байта). Там была палитра. Поэтому никогда не рассчитывайте на то, есть ли палитра и не надейтесь на ее размер (хотя все картинки, которые мне попадались имели размер палитры 256 цветов, или 1Кб), всегда перемещайтесь по файлу на начало растра, используя bfOffBits. Палитра представляет из себя массив структур RGBQUAD идущих друг за другом. Даже если в палитре используются не все цвета (а только, например, 16), то часто все равно под палитру отводят 256 полей. А 256 * 4 = 1024, где 4 - размер структуры RGBQUAD, то есть и получается тот самый один килобайт.

Сразу за палитрой идет сам растр. Тут уже более запутано. Во-первых, пиксели тут описываются так, как написано в таблице выше в зависимости от формата. И могут сами содержать значение компонентов цвета (для беспалитровых), а могут быть индексами массива-палитры. Сама картинка записывается построчно. Во-вторых, картинка идет как бы перевернутая вверх ногами. То есть сначала записана нижняя строка, потом предпоследняя и так далее до самого верха. И, в-третьих, как написано в , если размер строки растра не кратен 4, то она дополняется от 1 до 3 пустыми (нулевыми) байтами, чтобы длина строки оказалась кратна параграфу. Вот это и есть самое неприятное. Дело в том, что для каждого формата приходится подстраивать это число пустых байтов (правда, я люблю туда записывать часть палитры, просто мне не хочется заводить лишние "нулевые" переменные, если все-равно эти байты пропускают и никому они не нужны). Я привожу таблицу с формулами, которые показывают для какого формата сколько байт надо дописывать в конец строки. Там под переменной Width, как можно догадаться, подразумевается ширина картинки. Все эти формулы были установлены экспериментально. Я приведу пример только для наиболее используемых форматов. Для остальных вы можете написать сами.

Примеры программ

Все исходники вы можете скачать .Я особо не буду тут много писать. Просто приведу функции с комментариями.

Привет 1. Создание картинки в формате bmp.
Здесь создается однотонная картинка. В примерах таких функций три: создание bmp 8, 16 и 24 бит. Я приведу только для 16-битных.

// Создадим картинку в формате bmp 16 бит типа 5-5-5, которая будет просто однотонной
void CreateBmp555 (char * fname, WORD color)
{
HANDLE hFile;
DWORD RW;
int i, j;

// Объявим нужные структуры
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
BYTE Palette [ 1024 ] ; // Палитра

// Пусть у нас будет картинка размером 35 x 50 пикселей
int Width = 35 ;
int Height = 50 ;

memset (Palette, 0 , 1024 ) ; // В палитре у нас нули заполним их
memset (& bfh, 0 , sizeof (bfh) ) ;

Bfh.bfType = 0x4D42 ; // Обозначим, что это bmp "BM"
bfh.bfOffBits = sizeof (bfh) + sizeof (bih) + 1024 ; // Палитра занимает 1Kb, но мы его использовать не будем
bfh.bfSize = bfh.bfOffBits +
sizeof (color) * Width * Height +
Height * ((sizeof (color) * Width) % 4 ) ; // Посчитаем размер конечного файла
memset (& bih, 0 , sizeof (bih) ) ;
bih.biSize = sizeof (bih) ; // Так положено
bih.biBitCount = 16 ; // 16 бит на пиксель
bih.biClrUsed = 32768 ; // Мы используем 5-5-5
bih.biCompression = BI_RGB; // Без сжатия
bih.biHeight = Height;
bih.biWidth = Width;
bih.biPlanes = 1 ; // Должно быть 1
// А остальные поля остаются 0

HFile = CreateFile (fname, GENERIC_WRITE, 0 , NULL , CREATE_ALWAYS, 0 , NULL ) ;
if (hFile == INVALID_HANDLE_VALUE)
return ;

// Запишем заголовки
WriteFile (hFile, & bfh, sizeof (bfh) , & RW, NULL ) ;
WriteFile (hFile, & bih, sizeof (bih) , & RW, NULL ) ;

// Запишем палитру
WriteFile (hFile, Palette, 1024 , & RW, NULL ) ;
for (i = 0 ; i < Height; i++ )
{
for (j = 0 ; j < Width; j++ )
{
WriteFile (hFile, & color, sizeof (color) , & RW, NULL ) ;
}

// Выровняем по границе
WriteFile (hFile, Palette, (sizeof (color) * Width) % 4 , & RW, NULL ) ;
}
CloseHandle(hFile) ;
}

color - цвет картинки. Значение этой переменной должно быть заполнено в соответствии с первой таблицей. Получившуюся картинку вы можете посмотреть в ACDSee, например. Просто я пробовал ее открыть в Photoshop"е, оказалось, что в этом формате он их читать не умеет. А вы можете:).

Пример 2. Преобразование картинки из формата 8 бит (256 цветов) в 24 бит.

BOOL Convert256To24 (char * fin, char * fout)
{
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
int Width, Height;
RGBQUAD Palette[ 256 ] ;
BYTE * inBuf;
RGBTRIPLE * outBuf;
HANDLE hIn, hOut;
DWORD RW;
DWORD OffBits;
int i, j;

HIn = CreateFile (fin, GENERIC_READ, FILE_SHARE_READ, NULL , OPEN_EXISTING, 0 , NULL ) ;
if (hIn == INVALID_HANDLE_VALUE)
return FALSE;

HOut = CreateFile (fout, GENERIC_WRITE, 0 , NULL , CREATE_ALWAYS, 0 , NULL ) ;
if (hOut == INVALID_HANDLE_VALUE)
{
CloseHandle (hIn) ;
return FALSE;
}

// Прочтем данные
ReadFile (hIn, & bfh, sizeof (bfh) , & RW, NULL ) ;
ReadFile (hIn, & bih, sizeof (bih) , & RW, NULL ) ;
ReadFile (hIn, Palette, 256 * sizeof (RGBQUAD) , & RW, NULL ) ;

// Установим указатель на начало растра
SetFilePointer (hIn, bfh.bfOffBits , NULL , FILE_BEGIN) ;
Width = bih.biWidth ;
Height = bih.biHeight ;
OffBits = bfh.bfOffBits ;

// Выделим память
inBuf = new BYTE [ Width] ;
outBuf = new RGBTRIPLE [ Width] ;

// Заполним заголовки
bfh.bfOffBits = sizeof (bfh) + sizeof (bih) ; // Не будем писать палитру
bih.biBitCount = 24 ;
bfh.bfSize = bfh.bfOffBits + 4 * Width * Height + Height * (Width % 4 ) ; // Размер файла

// А остальное не меняется
// Запишем заголовки
WriteFile (hOut, & bfh, sizeof (bfh) , & RW, NULL ) ;
WriteFile (hOut, & bih, sizeof (bih) , & RW, NULL ) ;

// Начнем преобразовывать
for (i = 0 ; i < Height; i++ )
{
ReadFile (hIn, inBuf, Width, & RW, NULL ) ;
for (j = 0 ; j < Width; j++ )
{
outBuf[ j] .rgbtRed = Palette[ inBuf[ j] ] .rgbRed ;
outBuf[ j] .rgbtGreen = Palette[ inBuf[ j] ] .rgbGreen ;
outBuf[ j] .rgbtBlue = Palette[ inBuf[ j] ] .rgbBlue ;
}
WriteFile (hOut, outBuf, sizeof (RGBTRIPLE) * Width, & RW, NULL ) ;

// Пишем мусор для выравнивания
WriteFile (hOut, Palette, Width % 4 , & RW, NULL ) ;
SetFilePointer (hIn, (3 * Width) % 4 , NULL , FILE_CURRENT) ;
}

delete inBuf;
delete outBuf;
CloseHandle (hIn) ;
CloseHandle (hOut) ;
return TRUE;
}

В функцию надо передавать имена исходного и конечного файла соответственно.