¿Cómo se codifica una imagen PNG en base-64 para su uso en un uri de datos en un archivo CSS?


Quiero codificar un archivo PNG en base-64, para incluirlo en una url data:en mi hoja de estilos. ¿Cómo puedo hacer eso?

Estoy en un Mac, así que algo en la línea de comandos de Unix funcionaría muy bien. Una solución basada en Python también sería genial.

Author: Paul D. Waite, 2011-06-16

4 answers

Esto debería hacerlo en Python:

import base64
encoded = base64.b64encode(open("filename.png", "rb").read())
 52
Author: Jon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-13 20:02:45

En python3, base64.b64encode devuelve una instancia bytes, por lo que es necesario llamar a decode para obtener un str, si está trabajando con texto 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 está trabajando con bytes directamente, puede usar la salida de base64.b64encode sin decodificar más.

>>> encoded = base64.b64encode(image_data)
>>> b'data:image/png;base64,' + encoded
b'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='
 6
Author: snakecharmerb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-25 11:09:48

Esto debería hacerlo en Unix :

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

La imagen codificada producida por b64encode incluye un encabezado y pie de página y ninguna línea de más de 76 caracteres. Este formato es típico en las comunicaciones SMTP.

Para que la imagen codificada se pueda incrustar en HTML/CSS, los comandos sed y tr eliminan el encabezado/pie de página (primera y última línea) y todas las nuevas líneas, respectivamente.

Entonces simplemente use la cadena codificada larga en HTML

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

O en CSS

url(data:image/png;base64,ENCODED_PNG)
 4
Author: Clint Pachl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-09 09:58:24

B64encode no se instala por defecto en algunas distribuciones (respuesta de@Clint Pachl), pero python sí.

Por lo tanto, solo use:

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

Para obtener la imagen codificada base64 desde la línea de comandos.

Los pasos restantes ya fueron respondidas por @Clint Pachl (https://stackoverflow.com/a/20467682/1522342)

 1
Author: iuridiniz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-13 12:00:59