Como converter Base64 para BMP
- Cole o Base64 ou o URI
data:image/bmp;base64,...completo, ou abra um arquivo.txtcom a string. Strings de vários megabytes são normais para bitmaps e não são problema aqui. - A linha de status deve mostrar Detectado BMP. A prévia exibe a imagem e o tamanho em pixels; Tamanho dá o tamanho do arquivo decodificado em bytes.
- Clique em Baixar arquivo para salvar o
.bmp.
Os navegadores decodificam BMP em um <img>, incluindo arquivos monocromáticos de 1 bit, de paleta de 8 bits, de 24 bits e a maioria dos de 32 bits.
Tamanho do BMP pela largura e altura
Um BMP tem um cabeçalho de arquivo de 14 bytes, um cabeçalho de informações (40 bytes na versão comum), uma paleta opcional e depois as linhas de pixels. Cada linha é completada até um múltiplo de 4 bytes. Para uma imagem de 24 bits sem paleta:
file size = 54 + height × (width × 3, rounded up to a multiple of 4)
| Imagem | Tamanho da linha | Arquivo BMP | Comprimento em Base64 |
|---|---|---|---|
| 33×10, 24-bit | 99 → 100 bytes | 1,054 bytes | 1,408 chars |
| 100×100, 24-bit | 300 bytes | 30,054 bytes | 40,072 chars |
| 800×600, 24-bit | 2,400 bytes | 1,440,054 bytes | 1,920,072 chars |
| 1920×1080, 24-bit | 5,760 bytes | 6,220,854 bytes | 8,294,472 chars |
| 1920×1080, 1-bit | 240 bytes | 259,262 bytes | 345,684 chars |
A linha de 1 bit acrescenta uma paleta de 8 bytes com duas cores. Como os números são fixos, um bitmap é fácil de verificar: o cabeçalho do arquivo guarda o tamanho total nos bytes 2 a 5. No dump hex do exemplo de 100×100, eles aparecem como 66 75 00 00, que é 0x7566 = 30.054 como número little-endian. Se Tamanho mostrar menos que isso, o Base64 foi truncado. As linhas de um BMP são gravadas de baixo para cima por padrão, então um bitmap cortado perde a parte de cima da imagem.
Como é o Base64 de um BMP
Todo BMP começa com as letras BM, então o Base64 começa com Qk. O terceiro caractere depende do tamanho do arquivo e é 0, 1, 2 ou 3; Qk02 e Qk1m são típicos. O detector também confere o tamanho do cabeçalho de informações no byte 14, então dados aleatórios que por acaso começam com BM não são confundidos com um bitmap.
Bitmaps sem cabeçalho (DIB)
Algumas fontes entregam o bitmap sem o cabeçalho de arquivo BM. Isso é um DIB, o formato da área de transferência do Windows (CF_DIB), das imagens dentro de arquivos ICO e de alguns SDKs de dispositivos. O Base64 dele começa com KAAAA, a codificação do tamanho do cabeçalho de informações de 40 bytes, 28 00 00 00.
A ferramenta não consegue mostrar a prévia, já que sem o cabeçalho de arquivo os bytes não formam um arquivo de imagem válido, e indica dados binários. A solução é colocar os 14 bytes que faltam na frente:
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)))
O cabeçalho precisa do tamanho total do arquivo e do offset dos dados de pixels, que vêm depois do cabeçalho de informações, das máscaras de cor das imagens bitfield de 16 e 32 bits e da paleta. Codifique o resultado de novo com BMP para Base64 se precisar dele como texto, ou confira aqui. DIBs de arquivos ICO são um caso especial: a altura deles é dobrada para dar espaço a uma máscara de transparência. Base64 em Python tem mais sobre decodificação de dados binários.
Problemas comuns
- “Isto parece ser PNG, não BMP”. O remetente já converteu a imagem, ou o sistema só a chama de bitmap. Salve como PNG com Baixar como .png; é menor e todo programa lê.
- As cores aparecem trocadas ou a imagem fica de cabeça para baixo em outro programa. O BMP guarda os pixels como azul-verde-vermelho e normalmente de baixo para cima. Uma altura negativa no cabeçalho indica linhas de cima para baixo. Os navegadores lidam com tudo isso; leitores simples feitos sob medida às vezes não.
- Um dispositivo rejeita o arquivo decodificado. Compare o SHA-256 com o que o dispositivo recebeu e depois confira a profundidade de bits e a versão do cabeçalho no dump hex. Leitores mais antigos esperam um cabeçalho de 40 bytes (
28 00 00 00no offset 14) e nenhum canal alfa.
Perguntas frequentes
Por que a string Base64 do meu bitmap é tão longa?
O BMP guarda os pixels brutos, sem compressão. Um bitmap de 1920×1080 com 24 bits tem 6.220.854 bytes, o que dá 8.294.472 caracteres de Base64, não importa o que a imagem mostre.
Meu Base64 começa com KAAAA em vez de Qk. O que é isso?
Um bitmap sem o cabeçalho de arquivo de 14 bytes, chamado DIB. Ele vem da área de transferência do Windows, de alguns SDKs de dispositivos e de arquivos ICO. Acrescente o cabeçalho com o trecho de Python desta página e ele vira um .bmp normal.
Como saber se uma string BMP está completa?
Os bytes 2 a 5 do arquivo guardam o tamanho total. Abra Mostrar dump hex, leia esses bytes como número little-endian e compare com a linha Tamanho. Se o tamanho decodificado for menor, a string foi cortada.
Dá para obter um PNG em vez de BMP?
Esta página salva o bitmap como ele é. Para converter, baixe e arraste para BMP para Base64 com Converter para PNG; o PNG não tem perdas e costuma ser bem menor.