Base64 encode, il ne compresse pas
Le Base64 standard représente trois octets avec quatre caractères : longueur exacte 4 × ceil(n / 3), soit environ 33,3% de plus à long terme. Une Data URL ajoute le préfixe MIME.
L’outil réduit d’abord les octets de l’image : décodage, modification utile des dimensions, de la qualité ou du format, puis nouveau Base64 standard.
Gzip produit un autre type de résultat
Gzip appliqué au Base64 donne des données binaires à décompresser avant affichage. Les réencoder en Base64 n’en fait pas une Data URL d’image normale.
JPEG, PNG et WebP sont déjà compressés. Réduire les pixels, choisir une qualité avec perte, retirer les métadonnées ou changer de format peut aider, sans garantie de perte nulle ni de réduction.
Taille cible sans résultat plus gros
Pour JPEG et WebP, la qualité est recherchée avec une limite fixe. Si nécessaire, les dimensions diminuent en étapes bornées en gardant les proportions.
Si le Base64 standard n’a pas moins de caractères, les octets d’origine sont conservés. Une cible en Ko manquée est clairement indiquée avec le meilleur résultat plus petit.
Traitement local et limites explicites
Tout reste dans l’onglet : aucun envoi, URL distante, télémétrie ni bibliothèque d’image. Limites : 20 Mio et 16 mégapixels.
SVG, GIF, ICO et WebP animé sont refusés pour éviter exécution ou perte d’images. Auto préserve la transparence ; JPEG exige un fond confirmé. Canvas n’est pas un antivirus.
Quand éviter Base64
Pratique pour de petites ressources autonomes, il l’est moins pour de grandes images. Préférez alors Blob URL, fichier séparé ou transfert binaire pour le cache et le transport.
Octets d’image et caractères Base64 sont comparés séparément. Retirer le préfixe data: ne compte jamais comme compression.
Erreurs courantes expliquées
- Caractères, padding ou longueur Base64 invalides.
- Le MIME déclaré contredit les magic bytes.
- Plus de 20 Mio, 16 mégapixels ou échec de décodage.
- Image animée, multiframe, SVG ou déjà trop optimisée.
Commandes équivalentes
Utilisez le runtime ou le shell disponible. Validez les entrées non fiables et évitez d’imprimer du binaire directement dans le terminal.
Python
from PIL import Image
from io import BytesIO
import base64
image = Image.open(BytesIO(base64.b64decode(value)))
out = BytesIO(); image.save(out, 'WEBP', quality=82)
result = base64.b64encode(out.getvalue()).decode('ascii')
JavaScript
const blob = new Blob([bytes], { type: mime });
const bitmap = await createImageBitmap(blob);
ctx.drawImage(bitmap, 0, 0, width, height);
const output = await new Promise(r => canvas.toBlob(r, 'image/webp', 0.82));
bitmap.close();
Shell
printf '%s' "$VALUE" | base64 --decode > input.png
magick input.png -resize '1920x1920>' -quality 82 output.webp
base64 --wrap=0 output.webp
Normes et références officielles
FAQ sur la compression d’images Base64
Peut-on compresser Base64 ?
Une compression générale crée un autre format binaire. Pour garder du Base64 d’image standard, optimisez les octets puis réencodez.
Le résultat fonctionne-t-il dans img src ?
Oui. Raw est du Base64 standard et la Data URL suit data:image/...;base64.
Comment atteindre 100 Ko ?
Choisissez Custom et 100 Ko. La recherche de qualité et dimensions est bornée ; certaines images ne peuvent atteindre la cible.
La qualité baisse-t-elle ?
C’est possible. Redimensionnement et qualité JPEG/WebP sont avec perte ; PNG peut ne pas diminuer.
Pourquoi environ 33% de plus ?
Trois octets deviennent quatre caractères. La formule exacte est 4 × ceil(n / 3).
L’image est-elle envoyée ?
Non. Analyse, Canvas, aperçu, copie et téléchargement restent locaux.
Gzip avant ou après Base64 ?
Pour le transport, compressez la réponse HTTP externe si utile. Gzip ne fonctionne pas comme Data URL sans décompression.