Comment encoder une image PNG dans un fichier CSS?

je veux baser-64 encoder un fichier PNG, pour l'inclure dans une url data:dans ma feuille de style. Comment puis-je le faire?

je suis sur un Mac, donc quelque chose sur la ligne de commande Unix fonctionnerait très bien. Une solution basée sur Python serait également grandiose.

35
demandé sur Paul D. Waite 2011-06-16 21:18:05

4 réponses

Ceci devrait faire en Python:

import base64
encoded = base64.b64encode(open("filename.png", "rb").read())
52
répondu Jon 2015-08-13 20:02:45

en python3,base64.b64encode retourne un bytes instance, il est donc nécessaire d'appeler decode pour obtenir un str, si vous travaillez avec du texte unicode.

# Image data from [Wikipedia][1]
>>>image_data = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x05\x00\x00\x00\x05\x08\x06\x00\x00\x00\x8do&\xe5\x00\x00\x00\x1cIDAT\x08\xd7c\xf8\xff\xff?\xc3\x7f\x06 \x05\xc3 \x12\x84\xd01\xf1\x82X\xcd\x04\x00\x0e\xf55\xcb\xd1\x8e\x0e\x1f\x00\x00\x00\x00IEND\xaeB`\x82'

# String representation of bytes object includes leading "b" and quotes,  
# making the uri invalid.
>>> encoded = base64.b64encode(image_data) # Creates a bytes object
>>> 'data:image/png;base64,{}'.format(encoded)
"data:image/png;base64,b'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='"


# Calling .decode() gets us the right representation
>>> encoded = base64.b64encode(image_data).decode()
>>> 'data:image/png;base64,{}'.format(encoded)
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='

Si vous travaillez avec bytes directement, vous pouvez utiliser la sortie de base64.b64encode sans décodage.

>>> encoded = base64.b64encode(image_data)
>>> b'data:image/png;base64,' + encoded
b'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='
6
répondu snakecharmerb 2018-03-25 11:09:48

Ceci devrait faire en Unix:

b64encode filename.png X | sed '1d;$d' | tr -d '\n' > b64encoded.png

l'image codée produite par b64encode comprend un en-tête et un pied de page et ne dépasse pas 76 caractères. Ce format est typique des communications SMTP.

pour rendre l'image encodée intégrable en HTML/ CSS, le sed et tr les commandes suppriment l'en-tête/pied de page (première et dernière lignes) et toutes les nouvelles lignes, respectivement.

alors utilisez simplement la longue chaîne encodée dans HTML

<img src="data:image/png;base64,ENCODED_PNG">

ou CSS

url(data:image/png;base64,ENCODED_PNG)
4
répondu Clint Pachl 2013-12-09 09:58:24

b64encode n'est pas installé par défaut dans certaines distributions (réponse de@Clint Pachl), mais python l'est.

alors, il suffit d'utiliser:

python -mbase64 image.jpeg | tr -d '\n' > b64encoded.txt

afin d'obtenir l'image encodée base64 de la ligne de commande.

@Clint Pachl (https://stackoverflow.com/a/20467682/1522342)

1
répondu iuridiniz 2018-05-13 12:00:59