Comment convertir du Base64 en BMP
- Collez le Base64 ou l’URI complète
data:image/bmp;base64,..., ou ouvrez un fichier.txtcontenant la chaîne. Des chaînes de plusieurs mégaoctets sont normales pour des bitmaps et ne posent pas de problème ici. - La ligne d’état doit afficher Détecté BMP. L’aperçu montre l’image et ses dimensions en pixels ; Taille donne la taille du fichier décodé en octets.
- Appuyez sur Télécharger le fichier pour enregistrer le
.bmp.
Les navigateurs décodent le BMP dans une balise <img>, y compris les fichiers monochromes 1 bit, à palette 8 bits, en 24 bits et la plupart des fichiers 32 bits.
Taille d’un fichier BMP selon la largeur et la hauteur
Un BMP comporte un en-tête de fichier de 14 octets, un en-tête d’informations (40 octets dans la version courante), une palette facultative, puis les lignes de pixels. Chaque ligne est complétée jusqu’à un multiple de 4 octets. Pour une image 24 bits sans palette :
file size = 54 + height × (width × 3, rounded up to a multiple of 4)
| Image | Taille d’une ligne | Fichier BMP | Longueur Base64 |
|---|---|---|---|
| 33×10, 24 bits | 99 → 100 octets | 1 054 octets | 1 408 car. |
| 100×100, 24 bits | 300 octets | 30 054 octets | 40 072 car. |
| 800×600, 24 bits | 2 400 octets | 1 440 054 octets | 1 920 072 car. |
| 1920×1080, 24 bits | 5 760 octets | 6 220 854 octets | 8 294 472 car. |
| 1920×1080, 1 bit | 240 octets | 259 262 octets | 345 684 car. |
La ligne 1 bit ajoute une palette de deux couleurs de 8 octets. Comme les chiffres sont fixes, un bitmap se vérifie facilement : l’en-tête de fichier stocke la taille totale dans les octets 2 à 5. Dans le dump hex de l’exemple 100×100, on y lit 66 75 00 00, soit 0x7566 = 30 054 en little-endian. Si Taille affiche moins que cela, le Base64 a été tronqué. Les lignes BMP sont stockées par défaut de bas en haut : un bitmap tronqué perd donc le haut de l’image.
À quoi ressemble le Base64 d’un BMP
Tout BMP commence par les lettres BM, son Base64 commence donc par Qk. Le troisième caractère dépend de la taille du fichier et vaut 0, 1, 2 ou 3 ; Qk02 et Qk1m sont typiques. Le détecteur vérifie aussi la taille de l’en-tête d’informations à l’octet 14 : des données aléatoires qui commencent par hasard par BM ne sont donc pas prises pour un bitmap.
Bitmaps sans en-tête (DIB)
Certaines sources fournissent le bitmap sans l’en-tête de fichier BM. C’est un DIB, le format du presse-papiers Windows (CF_DIB), des images contenues dans les fichiers ICO et de certains SDK de périphériques. Son Base64 commence par KAAAA, l’encodage de la taille d’en-tête d’informations de 40 octets 28 00 00 00.
L’outil ne peut pas l’afficher, car sans en-tête de fichier les octets ne forment pas un fichier image valide, et il signale des données binaires. La solution consiste à ajouter devant les 14 octets manquants :
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)))
L’en-tête a besoin de la taille totale du fichier et de la position des données de pixels, qui suivent l’en-tête d’informations, les masques de couleur des images bitfield 16 et 32 bits, et la palette. Réencodez le résultat avec BMP en Base64 si vous en avez besoin sous forme de texte, ou vérifiez-le ici. Les DIB issus de fichiers ICO sont un cas particulier : leur hauteur est doublée pour laisser la place à un masque de transparence. Base64 en Python en dit plus sur le décodage de données binaires.
Problèmes courants
- « Cela ressemble à PNG, pas à un fichier BMP. » L’expéditeur a déjà converti l’image, ou le système l’appelle simplement bitmap. Enregistrez-la en PNG avec Télécharger en .png ; c’est plus petit et tous les programmes le lisent.
- Les couleurs semblent inversées ou l’image est à l’envers dans un autre programme. BMP stocke les pixels en bleu-vert-rouge et généralement de bas en haut. Une hauteur négative dans l’en-tête signifie des lignes de haut en bas. Les navigateurs gèrent tout cela ; les lecteurs maison simples, pas toujours.
- Un appareil refuse le fichier décodé. Comparez son SHA-256 avec ce que l’appareil a reçu, puis vérifiez la profondeur de couleur et la version de l’en-tête dans le dump hex. Les lecteurs anciens attendent un en-tête de 40 octets (
28 00 00 00à l’offset 14) et pas de canal alpha.
FAQ
Pourquoi ma chaîne Base64 de bitmap est-elle si longue ?
BMP stocke les pixels bruts sans compression. Un bitmap 1920×1080 en 24 bits fait 6 220 854 octets, soit 8 294 472 caractères Base64, quel que soit le contenu de l’image.
Mon Base64 commence par KAAAA au lieu de Qk. Qu'est-ce que c'est ?
Un bitmap sans son en-tête de fichier de 14 octets, ce qu’on appelle un DIB. Il provient du presse-papiers Windows, de certains SDK de périphériques et des fichiers ICO. Ajoutez l’en-tête avec l’extrait Python de cette page et il devient un .bmp normal.
Comment savoir si une chaîne BMP est complète ?
Les octets 2 à 5 du fichier contiennent sa taille totale. Ouvrez Afficher le dump hex, lisez-les comme un nombre little-endian et comparez-le à la ligne Taille. Si la taille décodée est plus petite, la chaîne a été tronquée.
Puis-je obtenir un PNG plutôt qu'un BMP ?
Cette page enregistre le bitmap tel quel. Pour le convertir, téléchargez-le et déposez-le dans BMP en Base64 avec Convertir en PNG ; le PNG est sans perte et généralement bien plus petit.