BMP зображення формат

Написано   Пол Бурк 
Липень 1998 року

Вступ

Файли BMP – це історичний (але все ще часто використовуваний) формат файлу для історичної (але все ще часто використовуваної) операційної системи під назвою “Windows”. BMP зображення може варіюватися від чорно-білого (1 біт на піксель) до 24 біт колір (16,7 млн. кольорів ). Хоча зображення можна стискати, це рідко використовується на практиці і не буде детально обговорюватися тут.

Структура

Файл BMP складається з 3 або 4 частин, як показано на схемі праворуч. Перша частина являє собою заголовок, це супроводжується інформацією розділу, якщо зображення індексується колір , то палітра слід, і в останню чергу це дані пікселів. Положення даних зображення по відношенню до sart файлу міститься в заголовку. Інформація, така як ширина і висота зображення, тип стиснення, кількість кольорів міститься в заголовку інформації.

Заголовок

Заголовок складається з наступних полів. Зауважимо, що ми припускаємо, що короткий int 2 байта, int 4 байта, і довгий int 8 байт. Далі ми припускаємо порядок байтів як для типових (Intel) машин. Заголовок має довжину 14 байт.

typedef struct {

   unsigned short int type;                 /* Magic identifier            */

   unsigned int size;                       /* File size in bytes          */

   unsigned short int reserved1, reserved2;

   unsigned int offset;                     /* Offset to image data, bytes */

} HEADER;

Корисними полями в цій структурі є поле типу (має бути “BM”), що є простою перевіркою, що це, ймовірно, буде легальний файл BMP, а поле зміщення, яке дає кількість байтів перед фактичними даними пікселів (це є відносно початку файлу).Зауважимо, що ця структура не кратна 4 байтам для тих машин / компіляторів, які могли б припустити це, ці машини, як правило , додають цю структуру до 2 байт до 16, що призначить майбутні виклики fread () – попереджати.

Інформація

Інформація про даних зображення , яке слід 40 байт в довжину, вона описана в структури , наведеної нижче. Найбільш цікавими полями є ширина і висота зображення, кількість бітів на піксель (повинно бути 1, 4, 8 або 24), кількість площин (припускається, що тут 1 ) і тип стиснення (передбачається, що бути 0).

typedef struct {

   unsigned int size;               /* Header size in bytes      */

   int width,height;                /* Width and height of image */

   unsigned short int planes;       /* Number of colour planes   */

   unsigned short int bits;         /* Bits per pixel            */

   unsigned int compression;        /* Compression type          */

   unsigned int imagesize;          /* Image size in bytes       */

   int xresolution,yresolution;     /* Pixels per meter          */

   unsigned int ncolours;           /* Number of colours         */

   unsigned int importantcolours;   /* Important colours         */

} INFOHEADER;

Типи стиснення, що підтримуються BMP, наведені нижче:

  •                    0 – ні стиснення
  •                    1 – 8 біт бігти довжини кодування
  •                    2 – 4 біт бігти довжини кодування
  •                    3 – бітове зображення RGB с маску

Тільки введіть 0 (тут не буде обговорено жодного стиснення).

24 біт зображення

Найпростіші даних для читання є 24 біт істинного кольору. У цьому випадку дані зображення слід відразу ж після того , як інформація заголовка, тобто, немає кольорової палітри. Він складається з трьох байтів на піксель в порядку b , g, r . Кожен байт дає насиченість для цього колірного компонента, 0 для чорного і 1 для білого (повністю насичений).

Індексовані дані кольору

Якщо зображення індексується кольором, то відразу після заголовка інформації з’явиться таблиця infoheader.ncolours кольорів , кожен з 4 байт. Перші три байти відповідають компонентам b , g, r , останній байт зарезервований / не використовується, але, очевидно, може представляти альфа-канал. Для 8-бітових зображень у відтінках сірого цей індекс кольору буде просто рампою сірого. Якщо ви робите суми …. тоді довжина заголовка плюс довжина інформаційного блоку плюс 4 рази кількість кольорів палітри повинна дорівнювати зміщенню даних зображення. Іншими словами

14 + 40 + 4 * infoheader.ncolours = header.offset

Вихідний код

Ось джерело, надане Майклом Світлом,   BITMAP.H ,   BITMAP.C , і   BMPVIEW.C .

І сам приклад коду,   parse.c   і приклад   24 бітний файл rgb BMP   для тестування. Зауважте, що жоден з цих сегментів коду не оброблятиме всі типи файлів BMP, зокрема, вони не обробляють стислі файли BMP. Вони повинні бути гарною відправною точкою для змін, що зустрічаються, і для тих, хто бажає писати файли, сумісні з BMP. З іншого боку, якщо у вас є або напишіть кращий обробник BMP, то ви можете подати для додавання тут.

Вклад Адама Маєвського, який записує один біт на піксельний файл BMP:   pf1bit_bmp.c .  
Внесок Гарольда Ходгінса для виправлення байтів, необхідних для деяких компіляторів:   bitmap2.h .