BMP зображення форматНаписано Пол Бурк Вступ Файли 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 (тут не буде обговорено жодного стиснення). 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 . |