Перейти до основного вмісту

Формати файлів

Що таке BMP? Пояснюємо формат растрових зображень

BMP - нестиснений формат растрових зображень без втрат у Windows. Пояснюємо структуру його заголовків, глибину кольору, обмеження і як зменшити такі файли.

Автор: Hemen Dönüştür Editör EkibiОпубліковано: 7 хв читання

Обкладинка посібника про формат файлів BMP

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. Поширені сьогодні розміри заголовків:

ЗаголовокРозмірГоловне нововведення
BITMAPCOREHEADER12 байтівБазова структура, сумісна з OS/2 1.x
BITMAPINFOHEADER40 байтівНайпоширеніший заголовок, від Windows 3.0; поля стиснення та роздільності
BITMAPV4HEADER108 байтівКолірні маски, альфа-маска та відомості про колірний простір
BITMAPV5HEADER124 байтиВбудовані чи пов'язані профілі 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 - надійніший вибір.

Джерела

Пов'язані конвертери

Усі статті