Формати файлів
Що таке BMP? Пояснюємо формат растрових зображень
BMP - нестиснений формат растрових зображень без втрат у Windows. Пояснюємо структуру його заголовків, глибину кольору, обмеження і як зменшити такі файли.
Автор: Hemen Dönüştür Editör EkibiОпубліковано: 7 хв читання

BMP - один із найстаріших і найпростіших форматів зображень у світі Windows. Файл BMP зазвичай записує пікселі на диск рядок за рядком без жодного стиснення. Завдяки цій простоті його легко читати і він не має втрат, але через ту саму простоту файли виходять величезними. У цій статті розповідаємо, звідки взявся BMP, що всередині файлу, про тонкощі глибини кольору та прозорості, де він трапляється досі і як конвертувати файли BMP у практичніші формати.
Що таке BMP?
BMP (bitmap, розширення .bmp) - растровий, тобто піксельний, формат файлів зображень. У технічній документації його також називають DIB, апаратно-незалежним растровим зображенням (device-independent bitmap). "Апаратно-незалежне" означає, що зображення можна інтерпретувати однаково незалежно від відеокарти чи принтера, на яких його створено: файл містить відомості, потрібні для декодування кольорів, у власному заголовку та таблиці кольорів.
Згідно з документацією Microsoft щодо Win32, файл растрового зображення починається зі структури BITMAPFILEHEADER, за якою йде BITMAPINFOHEADER, BITMAPV4HEADER або BITMAPV5HEADER, потім необов'язкова таблиця кольорів і, нарешті, дані пікселів. MIME-тип - image/bmp.
Коротка історія: від Windows і OS/2 до сьогодні
BMP виник наприкінці 1980-х зі спільної роботи Microsoft та IBM над Windows і OS/2. Растрові зображення часів Windows 1.0 сильно залежали від пристрою виведення; апаратно-незалежна форма поширилася з Windows 3.0 у 1990 році. Через 12-байтовий BITMAPCOREHEADER, визначений для OS/2 Presentation Manager, досі говорять про файли "OS/2 BMP".
З роками формат розширювали, додаючи поля в кінець заголовка. Згідно з описом формату від Бібліотеки Конгресу США, версія 5 з'явилася з Windows 98 у 1998 році й дала змогу записувати у файл колірні профілі ICC. Поширені сьогодні розміри заголовків:
| Заголовок | Розмір | Головне нововведення |
|---|---|---|
| BITMAPCOREHEADER | 12 байтів | Базова структура, сумісна з OS/2 1.x |
| BITMAPINFOHEADER | 40 байтів | Найпоширеніший заголовок, від Windows 3.0; поля стиснення та роздільності |
| BITMAPV4HEADER | 108 байтів | Колірні маски, альфа-маска та відомості про колірний простір |
| BITMAPV5HEADER | 124 байти | Вбудовані чи пов'язані профілі ICC, метод передавання кольорів (rendering intent) |
Програми визначають, який заголовок використано, за значенням розміру в його першому полі. Тож старіші програми можуть ігнорувати новіші поля й усе одно читати основне.
Усередині файлу BMP
Заголовок файлу та сигнатура "BM"
Кожен файл BMP починається з 14-байтового заголовка файлу, і його перші два байти - символи ASCII BM (шістнадцяткове 42 4D). Заголовок зберігає загальний розмір файлу та байтовий зсув, з якого починаються дані пікселів. DIB, поміщений у буфер обміну Windows (формат CF_DIB), не має цих 14 байтів і починається одразу з інформаційного заголовка.
Інформаційний заголовок
Інформаційний заголовок містить ширину, висоту, кількість бітів на піксель (biBitCount), тип стиснення, горизонтальну й вертикальну роздільність (у пікселях на метр) і кількість кольорів, використаних у таблиці кольорів.
Таблиця кольорів (палітра)
У зображеннях із 8 або менше бітами на піксель піксель є не кольором, а індексом у таблиці кольорів. У прикладі з документації Microsoft растрове зображення 32x32 з 16 кольорами має масив пікселів розміром 32 x 32 x 4 = 4096 бітів, бо для адресації 16 кольорів достатньо 4 бітів.
Дані пікселів: рядки знизу вгору та вирівнювання до 4 байтів
BMP має дві незвичні риси. По-перше, якщо висота додатна, рядки зберігаються знизу вгору: перший рядок у файлі - нижній рядок зображення. Від'ємна висота зберігає рядки згори донизу, але такі зображення не можна стискати. По-друге, кожен рядок доповнюється до кратного 4 байтам. Microsoft наводить довжину рядка (stride) так:
stride = ((width * bitCount + 31) & ~31) >> 3
imageSize = |height| * stride
Для зображення 1920x1080 з глибиною 24 біти кожен рядок займає 1920 x 3 = 5760 байтів (уже кратно 4), тож дані пікселів становлять 5760 x 1080 = 6 220 800 байтів. Разом із 54-байтовими заголовками файл має близько 6,2 МБ. Та сама картинка у форматі JPG зазвичай становить невелику частку цього розміру.
Глибина кольору, стиснення та прозорість
Документація BITMAPV5HEADER визначає 1, 4, 8, 16, 24 і 32 біти на піксель (значення 0 означає, що глибина визначається вбудованими даними JPEG або PNG). 1 біт - це чорно-біле зображення, 4 біти - 16 кольорів, а 8 бітів - палітра з 256 кольорів. За 24 бітів кожен піксель займає три байти в порядку синій, зелений, червоний.
Поле стиснення може набувати таких значень:
- BI_RGB: без стиснення. На практиці це переважна більшість файлів BMP.
- BI_RLE8 і BI_RLE4: просте кодування довжин серій для 8- і 4-бітних зображень із палітрою. Корисне для великих однорідних ділянок, майже марне для фото.
- BI_BITFIELDS: не стиснення; маски визначають, де розташовані біти червоного, зеленого й синього в 16- і 32-бітних пікселях (наприклад, RGB 565).
- BI_JPEG і BI_PNG: дозволяють дані JPEG або PNG усередині растрового зображення. Рідко підтримуються універсальними переглядачами.
Прозорість - найсуперечливіша частина BMP. Альфа-маска в заголовках V4 і V5 може визначити четвертий байт 32-бітного пікселя як непрозорість, але в класичному 32-бітному BMP цей байт описано як невикористовуваний, і багато програм його ігнорують. Тож 32-бітний BMP, який в одній програмі виглядає прозорим, а в іншій лежить на чорному тлі, - звичайна річ. Якщо вам потрібна прозорість, PNG - значно надійніший вибір.
Підтримка в системах, браузерах і програмах
BMP відкривається майже всюди. Вбудовані переглядачі Windows і Paint, Перегляд (Preview) у macOS і поширені переглядачі в Linux читають його. Посібник MDN із форматів зображень зазначає підтримку BMP в усіх версіях Chrome, Edge, Firefox, Opera і Safari. Водночас той самий посібник наголошує, що нестиснені файли BMP дуже великі порівняно з PNG чи JPG і їх загалом слід уникати для вмісту вебсайтів.
Де використовують BMP сьогодні?
- Ресурси застосунків Windows і застарілі програми: зображення панелей інструментів, графіка майстрів встановлення та деякі ресурси ігор досі у форматі BMP.
- Вбудовані системи та мікроконтролери: пристрою з дисплеєм не потрібен декодер JPEG; дані пікселів можна копіювати прямо на екран.
- Промислові камери, сканери та тестові інструменти: коли потрібен необроблений результат без втрат, BMP - простий проміжний формат.
- Навчання: із заголовком лише в кілька десятків байтів BMP часто стає першим форматом, який студенти читають і записують на курсах обробки зображень.
Переваги й недоліки
| Переваги | Недоліки |
|---|---|
| Без втрат; значення пікселів ніколи не змінюються | Без стиснення, тож файли дуже великі |
| Елементарно читати й записувати, без навантаження на процесор | Непослідовна підтримка прозорості |
| Відкривається майже в будь-якій операційній системі та браузері | Слабка підтримка метаданих (EXIF, описи) |
| Режими з палітрою підходять для малопотужних пристроїв | Непрактичний для вебу, електронної пошти та форм завантаження |
Типові проблеми та як їх розв'язати
Файл завеликий для електронної пошти чи форми завантаження
Це найпоширеніша проблема. Для фото та сканів конвертація BMP у JPG зазвичай зменшує розмір на порядок і більше. Для знімків екрана, схем чи будь-чого з текстом краще конвертувати BMP у PNG: PNG теж без втрат, але стиснений, і він не додає шуму, який JPG створює навколо різких країв.
32-бітний BMP показує чорне тло
Програма не розпізнає байт альфа-каналу або неправильно його читає. Зазвичай допомагає конвертація в PNG. Під час конвертації в JPG, який не має прозорості, прозорі ділянки заповнюються білим або обраним вами кольором.
Зображення перевернуте або перекошене
У власноруч написаній програмі читання це зазвичай наслідок двох помилок: ігнорування того, що рядки зберігаються знизу вгору, або непропускання байтів доповнення в кінці кожного рядка. Використання наведеної вище формули stride і перевірка знака висоти запобігають обом.
Програма відмовляється відкривати BMP
Файли BMP зі стисненням RLE, BI_BITFIELDS або вбудованими даними JPEG/PNG деякі прості програми читання не підтримують. Повторне збереження як нестиснений 24-бітний BMP або конвертація в PNG усуває проблему сумісності.
Поради щодо конвертації
- JPG для фото, PNG для графіки: під час переходу з BMP діє звичне правило. Для вебу в конвертері зображень можна також обрати WebP або AVIF.
- Тримайте якість високою: оскільки BMP без втрат, якість JPG 85-90% дає результат, який важко відрізнити від оригіналу.
- За потреби зменшуйте: якщо файл усе ще великий, зменште розміри в пікселях або скористайтеся стисненням зображень, щоб досягти потрібного розміру.
- У зворотному напрямку: якщо вбудованому пристрою чи застарілій програмі потрібен BMP, оберіть BMP як цільовий формат у конвертері зображень. Наші інструменти записують стандартний нестиснений 24-бітний BMP; прозорі ділянки накладаються на обраний вами колір тла.
Наші сторінки конвертації BMP працюють у вашому браузері: файл не завантажується на сервер і не залишає вашого пристрою.
Часті запитання
BMP і DIB - це одне й те саме?
На практиці так. DIB - структура апаратно-незалежного растрового зображення, яку Windows використовує в пам'яті та в буфері обміну; файл BMP - це та сама структура з 14-байтовим заголовком файлу попереду.
Чи BMP без втрат?
Так. Нестиснені файли BMP і файли зі стисненням RLE зберігають значення пікселів точно. Єдиний виняток - рідкісні BMP із вбудованими даними JPEG.
Чи втрачається якість під час конвертації BMP у PNG?
Ні. PNG теж формат без втрат; зображення залишається ідентичним і лише зменшується завдяки стисненню.
Чи можна використовувати BMP на сайті?
Браузери показують BMP, але файли невиправдано великі й сповільнюють сторінки. Для вебу використовуйте JPG, PNG, WebP або AVIF.
Чи підтримує BMP прозорість?
32-бітний BMP теоретично може містити альфа-канал, але програми підтримують його непослідовно. Коли потрібна прозорість, PNG - надійніший вибір.


