Как перевести Base64 в BMP
- Вставьте Base64 или полный URI
data:image/bmp;base64,...либо откройте файл.txtсо строкой. Для BMP строки в несколько мегабайт – обычное дело, и инструмент с ними справляется. - В строке статуса должно быть Определено: BMP. Превью показывает изображение и его размер в пикселях, а Размер – размер декодированного файла в байтах.
- Нажмите Скачать файл, чтобы сохранить
.bmp.
Браузеры показывают BMP в <img>, включая 1-битные монохромные, 8-битные с палитрой, 24-битные и большинство 32-битных файлов.
Размер предсказуем
У BMP есть 14-байтовый заголовок файла, информационный заголовок (40 байт в самой распространённой версии), необязательная палитра и затем строки пикселей. Каждая строка дополняется до кратного 4 числа байтов. Для 24-битного изображения без палитры:
file size = 54 + height × (width × 3, rounded up to a multiple of 4)
| Изображение | Размер строки | Файл BMP | Длина Base64 |
|---|---|---|---|
| 33×10, 24 бита | 99 → 100 байт | 1 054 байта | 1 408 символов |
| 100×100, 24 бита | 300 байт | 30 054 байта | 40 072 символа |
| 800×600, 24 бита | 2 400 байт | 1 440 054 байта | 1 920 072 символа |
| 1920×1080, 24 бита | 5 760 байт | 6 220 854 байта | 8 294 472 символа |
| 1920×1080, 1 бит | 240 байт | 259 262 байта | 345 684 символа |
В 1-битном варианте добавляется 8-байтовая палитра на два цвета. Раз числа фиксированы, BMP легко проверить: заголовок файла хранит общий размер в байтах со 2-го по 5-й. В hex-дампе примера 100×100 там стоит 66 75 00 00, то есть 0x7566 = 30 054 в порядке little-endian. Если Размер показывает меньше, Base64 обрезан. По умолчанию строки BMP хранятся снизу вверх, поэтому у обрезанной картинки пропадает верхняя часть.
Как выглядит BMP в Base64
Каждый BMP начинается с букв BM, поэтому Base64 начинается с Qk. Третий символ зависит от размера файла и бывает 0, 1, 2 или 3; типичные начала – Qk02 и Qk1m. Детектор также проверяет размер информационного заголовка в байте 14, чтобы случайные данные, которые начинаются с BM, не приняли за картинку.
BMP без заголовка (DIB)
Некоторые источники отдают изображение без заголовка файла BM. Это DIB: так хранят изображения буфер обмена Windows (CF_DIB), файлы ICO и некоторые SDK устройств. Его Base64 начинается с KAAAA, так кодируется размер 40-байтового информационного заголовка 28 00 00 00.
Показать превью инструмент не может: без заголовка файла байты не складываются в корректное изображение, поэтому он сообщает о двоичных данных. Чтобы это исправить, допишите спереди 14 недостающих байтов:
import base64, struct
def dib_to_bmp(dib: bytes) -> bytes:
header_size, = struct.unpack_from("<I", dib, 0)
bpp, = struct.unpack_from("<H", dib, 14)
compression, colors = struct.unpack_from("<I", dib, 16)[0], struct.unpack_from("<I", dib, 32)[0]
if bpp <= 8 and colors == 0:
colors = 1 << bpp
masks = 12 if header_size == 40 and compression == 3 else 0
offset = 14 + header_size + masks + colors * 4
return b"BM" + struct.pack("<IHHI", 14 + len(dib), 0, 0, offset) + dib
b64 = open("dib.txt").read()
with open("image.bmp", "wb") as f:
f.write(dib_to_bmp(base64.b64decode(b64)))
Заголовку нужны общий размер файла и смещение пиксельных данных, которые идут после информационного заголовка, цветовых масок 16- и 32-битных изображений с битовыми полями и палитры. Если результат нужен в виде текста, закодируйте его снова через BMP в Base64 или проверьте здесь. DIB из файлов ICO – особый случай: высота в них удвоена, чтобы вместить маску прозрачности. Подробнее о декодировании двоичных данных рассказывает статья Base64 в Python.
Частые проблемы
- «Похоже на PNG, а не на BMP». Отправитель уже сконвертировал изображение, или система просто называет его bitmap. Сохраните его кнопкой Скачать как .png: PNG меньше, и его откроет любая программа.
- В другой программе перепутаны цвета или картинка перевёрнута. BMP хранит пиксели в порядке синий-зелёный-красный и обычно снизу вверх. Отрицательная высота в заголовке означает строки сверху вниз. Браузеры всё это учитывают, а простые самописные парсеры – не всегда.
- Устройство не принимает декодированный файл. Сравните его SHA-256 с тем, что получило устройство, затем проверьте в hex-дампе глубину цвета и версию заголовка. Старые парсеры ждут 40-байтовый заголовок (
28 00 00 00по смещению 14) и отсутствие альфа-канала.
Вопросы и ответы
Почему строка Base64 с картинкой BMP такая длинная?
BMP хранит пиксели как есть, без сжатия. 24-битная картинка 1920×1080 занимает 6 220 854 байта, то есть 8 294 472 символа Base64, что бы на ней ни было изображено.
Мой Base64 начинается с KAAAA, а не с Qk. Что это?
Это bitmap без 14-байтового заголовка файла, так называемый DIB. Он встречается в буфере обмена Windows, некоторых SDK устройств и внутри файлов ICO. Добавьте заголовок скриптом на Python с этой страницы, и получится обычный .bmp.
Как понять, что строка BMP полная?
В байтах со 2-го по 5-й записан общий размер файла. Откройте Показать hex-дамп, прочитайте их как число little-endian и сравните со строкой Размер. Если декодированный размер меньше, строку обрезали.
Можно ли получить PNG вместо BMP?
Эта страница сохраняет картинку как есть. Чтобы конвертировать, скачайте её и перетащите в BMP в Base64, выбрав PNG в поле Конвертировать в; PNG не теряет качество и обычно намного меньше.