Технологии

Почему BMP такой тяжёлый: как устроен файл изнутри

Однотонный белый квадрат и сложная фотография одного размера весят в BMP абсолютно одинаково. Звучит странно? На самом деле в этом — вся суть формата. Разберём файл BMP по байтам, выведем простую формулу его веса и поймём, почему несжатый формат физически не может быть лёгким.

Винтажный компьютер Commodore с зелёной графикой — техника, для которой простота BMP была преимуществом
BMP тяжёлый не по ошибке, а по замыслу: он хранит каждый пиксель честно и в лоб. Фото: Pexels

Корень проблемы: ноль сжатия

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

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

Главная мысль

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

Анатомия файла BMP

Файл BMP состоит из четырёх блоков, идущих строго по порядку. Первые три — служебные и крошечные, а весь вес сосредоточен в четвёртом.

Заголовок файла
14 байт
DIB-заголовок
40 байт (обычно)
Палитра
0 байт (для truecolor)
Пиксели
99,9% веса файла

Разберём подробнее:

  • Заголовок файла (14 байт) — начинается с подписи BM, хранит общий размер файла и смещение до начала пикселей.
  • DIB-заголовок (40 байт) — это BITMAPINFOHEADER: ширина, высота, глубина цвета, разрешение и тип сжатия.
  • Палитра — нужна только картинкам с малым числом цветов (1, 4, 8 бит). В полноцветном 24-битном BMP её просто нет.
  • Пиксельные данные — собственно картинка. Именно здесь живут десятки мегабайт.

Итого служебная часть полноцветного BMP — всего 54 байта. На фоне 36-мегабайтного файла это исчезающе мало. Весь вес создают пиксели.

Человек держит тяжёлый винтажный компьютер-моноблок — метафора веса формата BMP
Вес BMP легко ощутить буквально: формат несёт каждый пиксель, не выбрасывая ничего. Фото: Pexels

Формула веса: считаем сами

Раз вес создают только пиксели, его легко посчитать заранее. Базовая формула для несжатого BMP:

Размер ≈ Ширина × Высота × (Бит на пиксель ÷ 8)

Деление на 8 переводит биты в байты. Для самого частого случая — 24-битного truecolor — на каждый пиксель приходится 3 байта (по одному на синий, зелёный и красный). Значит, формула упрощается до Ширина × Высота × 3. Прибавьте 54 байта заголовков — и вы знаете размер файла ещё до того, как он сохранён.

Быстрая прикидка

Чтобы прикинуть вес 24-битного BMP в мегабайтах, умножьте число мегапикселей на 3. Камера на 12 Мп → ≈36 МБ. Экран 2 Мп (Full HD) → ≈6 МБ. Просто и всегда работает.

Примеры на реальных разрешениях

Подставим в формулу привычные размеры изображений (24-битный BMP):

РазрешениеПикселейРазмер BMPДля сравнения JPG
640×4800,3 Мп~0,9 МБ~60 КБ
1280×720 (HD)0,9 Мп~2,6 МБ~150 КБ
1920×1080 (Full HD)2,1 Мп~6 МБ~400 КБ
4000×3000 (12 Мп)12 Мп~36 МБ~3 МБ
6000×4000 (24 Мп)24 Мп~72 МБ~6 МБ

Закономерность очевидна: вес BMP растёт линейно с числом пикселей и в среднем в 10–15 раз превышает JPG. Удвоили разрешение по обеим сторонам — файл вырос вчетверо. Никакого сжатия, чтобы сгладить рост, у формата нет.

3 байтана пиксель (24 бита)
54 байтавсе заголовки truecolor
×4рост при удвоении сторон

Выравнивание строк: скрытые байты

Есть у BMP и небольшой «скрытый налог» на вес. Формат требует, чтобы каждая строка пикселей занимала количество байт, кратное 4. Если строка не дотягивает до круглого числа, в конец добавляются нули-заполнители.

Зачем? Так процессору быстрее читать данные из памяти — он работает с блоками по 4 байта эффективнее. Это снова та же философия: пожертвовать местом ради скорости. На широких изображениях добавка ничтожна, но на узких полосках она может заметно раздуть файл относительно «чистого» содержимого.

Ретро-компьютеры с цветной пиксельной графикой — каждая точка экрана хранится в BMP отдельно
Каждая точка такого экрана в BMP — это отдельные байты в файле. Отсюда и вес. Фото: Pexels

Почему PNG и JPG легче

Теперь, зная природу BMP, легко понять, в чём фокус его соперников:

  • PNG ищет повторы и плавные переходы и кодирует их компактно — без единой потери. Тот самый белый квадрат в PNG весит считанные килобайты, потому что формат понимает: «здесь всё одинаковое».
  • JPG идёт дальше: он разбивает фото на блоки и выбрасывает мелкие детали, которые глаз почти не замечает. Это сжатие с потерями, зато вес падает в десятки раз.

BMP не делает ни того, ни другого. Он не «плохой» — он просто из эпохи, когда сжатие было дорогим, а простота ценилась выше компактности. Сегодня же приоритеты противоположны, поэтому BMP почти всегда выгодно конвертировать. Подробнее об их различиях — в статье BMP против PNG и JPG.

Как победить вес

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

1

Загрузите BMP

Перетащите тяжёлый .bmp в онлайн-конвертер.

2

Выберите PNG или JPG

PNG — без потерь для графики, JPG — минимальный вес для фото.

3

Скачайте лёгкий файл

Те же пиксели, но в разы меньше байт.

Превратите тяжёлый BMP в лёгкий файл

Бесплатный конвертер FormatZ сожмёт ваш BMP без потери качества прямо в браузере — без установки и регистрации.

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

Для фотографий ещё выгоднее конвертация BMP в JPG. Хотите узнать, где несжатый формат всё-таки уместен? Прочитайте, где BMP используется сегодня, или начните с основ — что такое BMP. Все преобразования — на странице всех форматов.

BMP не сжимает изображение: он записывает цвет каждого пикселя напрямую. Размер файла равен ширина × высота × число байт на пиксель плюс небольшой заголовок. Поэтому вес зависит только от разрешения и глубины цвета, а не от содержимого картинки.
Для 24-битного BMP примерная формула: ширина × высота × 3 байта. Например, изображение 1920×1080 занимает около 6 МБ, а 4000×3000 — около 36 МБ. К этому добавляются 54 байта заголовков и небольшое выравнивание строк.
Почти нет. Однотонный белый квадрат и сложная фотография одного разрешения в несжатом BMP весят одинаково, потому что для каждого пикселя всё равно хранятся его байты. В PNG и JPG однотонная картинка была бы намного легче.
В BMP каждая строка пикселей дополняется нулями до длины, кратной 4 байтам, — это ускоряет чтение в памяти. Для узких изображений такое выравнивание немного увеличивает итоговый размер файла.
Конвертировать его в сжатый формат. PNG уменьшит вес без потери качества, JPG — ещё сильнее за счёт сжатия с потерями. Сделать это можно за пару секунд в онлайн-конвертере FormatZ.