Cómo convertir Base64 a BMP
- Pega el Base64 o la URI completa
data:image/bmp;base64,..., o abre un archivo.txtcon la cadena. Las cadenas de varios megabytes son normales en los bitmaps y aquí no dan problemas. - La línea de estado debería decir Detectado BMP. La vista previa muestra la imagen y su tamaño en píxeles; Tamaño da el tamaño del archivo decodificado en bytes.
- Pulsa Descargar archivo para guardar el
.bmp.
Los navegadores decodifican BMP en un <img>, incluidos los archivos monocromo de 1 bit, de paleta de 8 bits, de 24 bits y la mayoría de los de 32 bits.
Tamaño del archivo BMP a partir del ancho y el alto
Un BMP tiene un encabezado de archivo de 14 bytes, un encabezado de información (40 bytes en la versión habitual), una paleta opcional y después las filas de píxeles. Cada fila se rellena hasta un múltiplo de 4 bytes. Para una imagen de 24 bits sin paleta:
file size = 54 + height × (width × 3, rounded up to a multiple of 4)
| Imagen | Tamaño de fila | Archivo BMP | Longitud Base64 |
|---|---|---|---|
| 33×10, 24 bits | 99 → 100 bytes | 1.054 bytes | 1.408 caracteres |
| 100×100, 24 bits | 300 bytes | 30.054 bytes | 40.072 caracteres |
| 800×600, 24 bits | 2.400 bytes | 1.440.054 bytes | 1.920.072 caracteres |
| 1920×1080, 24 bits | 5.760 bytes | 6.220.854 bytes | 8.294.472 caracteres |
| 1920×1080, 1 bit | 240 bytes | 259.262 bytes | 345.684 caracteres |
La fila de 1 bit añade una paleta de dos colores de 8 bytes. Como las cifras son fijas, un bitmap es fácil de comprobar: el encabezado de archivo guarda el tamaño total en los bytes 2 a 5. En el volcado hex del ejemplo de 100×100 se lee 66 75 00 00, que es 0x7566 = 30.054 como número little-endian. Si Tamaño muestra menos, el Base64 estaba truncado. Las filas de un BMP se guardan por defecto de abajo arriba, así que un bitmap cortado pierde la parte superior de la imagen.
Cómo es el Base64 de un BMP
Todo BMP empieza por las letras BM, así que el Base64 empieza por Qk. El tercer carácter depende del tamaño del archivo y es 0, 1, 2 o 3; Qk02 y Qk1m son típicos. El detector también comprueba el tamaño del encabezado de información en el byte 14, para que unos datos aleatorios que por casualidad empiecen por BM no se tomen por un bitmap.
Bitmaps sin encabezado (DIB)
Algunas fuentes te entregan el bitmap sin el encabezado de archivo BM. Es un DIB, el formato del portapapeles de Windows (CF_DIB), de las imágenes dentro de los archivos ICO y de algunos SDK de dispositivos. Su Base64 empieza por KAAAA, la codificación del tamaño de encabezado de información de 40 bytes 28 00 00 00.
La herramienta no puede mostrar la vista previa, porque sin el encabezado de archivo los bytes no son un archivo de imagen válido, e indica que son datos binarios. La solución es poner delante los 14 bytes que faltan:
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)))
El encabezado necesita el tamaño total del archivo y el desplazamiento de los datos de píxeles, que van después del encabezado de información, de las máscaras de color de las imágenes bitfield de 16 y 32 bits y de la paleta. Vuelve a codificar el resultado con BMP a Base64 si lo necesitas como texto, o compruébalo aquí. Los DIB de archivos ICO son un caso especial: su altura está duplicada para dejar sitio a una máscara de transparencia. Base64 en Python explica más sobre la decodificación de datos binarios.
Problemas habituales
- «Esto parece PNG, no BMP». El remitente ya convirtió la imagen, o el sistema solo la llama bitmap. Guárdala como PNG con Descargar como .png; ocupa menos y la lee cualquier programa.
- En otro programa los colores salen cambiados o la imagen aparece al revés. BMP guarda los píxeles como azul-verde-rojo y normalmente de abajo arriba. Una altura negativa en el encabezado significa filas de arriba abajo. Los navegadores manejan todo esto; los lectores caseros sencillos a veces no.
- Un dispositivo rechaza el archivo decodificado. Compara su SHA-256 con lo que recibió el dispositivo y después revisa la profundidad de bits y la versión del encabezado en el volcado hex. Los lectores antiguos esperan un encabezado de 40 bytes (
28 00 00 00en el desplazamiento 14) y ningún canal alfa.
Preguntas frecuentes
¿Por qué mi cadena Base64 de un bitmap es tan larga?
BMP guarda los píxeles en bruto, sin compresión. Un bitmap de 1920×1080 a 24 bits ocupa 6.220.854 bytes, que son 8.294.472 caracteres de Base64, muestre lo que muestre la imagen.
Mi Base64 empieza por KAAAA en lugar de Qk. ¿Qué es?
Un bitmap sin su encabezado de archivo de 14 bytes, lo que se llama DIB. Sale del portapapeles de Windows, de algunos SDK de dispositivos y de los archivos ICO. Añade el encabezado con el fragmento de Python de esta página y se convierte en un .bmp normal.
¿Cómo sé si una cadena BMP está completa?
Los bytes 2 a 5 del archivo guardan su tamaño total. Abre Mostrar volcado hex, léelos como número little-endian y compáralo con la fila Tamaño. Si el tamaño decodificado es menor, la cadena se cortó.
¿Puedo obtener un PNG en lugar de un BMP?
Esta página guarda el bitmap tal cual. Para convertirlo, descárgalo y suéltalo en BMP a Base64 con Convertir a PNG; PNG no tiene pérdida y suele ocupar mucho menos.