wake-up-neo.net

Wie codieren Sie ein 64-Bit-PNG-Bild zur Verwendung in einem Daten-URI in einer CSS-Datei?

Ich möchte eine 64-Base-64-Kodierung durchführen, um sie in eine data: URL in mein Stylesheet aufzunehmen. Wie kann ich das machen?

Ich bin auf einem Mac, also würde etwas auf der Unix-Befehlszeile gut funktionieren. Eine auf Python basierende Lösung wäre ebenfalls großartig.

37
Paul D. Waite

Dies sollte es in Python tun:

import base64
encoded = base64.b64encode(open("filename.png", "rb").read())
55
Jon

In python3 gibt base64.b64encode eine bytes-Instanz zurück. Wenn Sie mit Unicode-Text arbeiten, müssen Sie decode aufrufen, um eine str abzurufen.

# 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=='

Wenn Sie direkt mit bytes arbeiten, können Sie die Ausgabe von base64.b64encode ohne weitere Dekodierung verwenden.

>>> encoded = base64.b64encode(image_data)
>>> b'data:image/png;base64,' + encoded
b'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='
12
snakecharmerb

Dies sollte es in Unix tun:

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

Das von b64encode erzeugte kodierte Bild enthält eine Kopf- und Fußzeile und keine Zeile mit mehr als 76 Zeichen. Dieses Format ist typisch für die SMTP-Kommunikation.

Um das codierte Bild in HTML/CSS einbetten zu können, entfernen die Befehle sed und tr die Kopf-/Fußzeile (erste und letzte Zeile) bzw. alle Zeilenumbrüche.

Dann verwenden Sie einfach den langen codierten String inHTML

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

oder inCSS

url(data:image/png;base64,ENCODED_PNG)
4
Clint Pachl

b64encode wird in manchen Distributionen nicht standardmäßig installiert (@Clint Pachls Antwort), Python jedoch.

Verwenden Sie also einfach:

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

Um Base64-codiertes Bild von der Befehlszeile zu erhalten.

Die restlichen Schritte wurden bereits von @Clint Pachl beantwortet ( https://stackoverflow.com/a/20467682/1522342 )

1
iuridiniz
import base64

def image_to_data_url(filename):
    ext = filename.split('.')[-1]
    prefix = f'data:image/{ext};base64,'
    with open(filename, 'rb') as f:
        img = f.read()
    return prefix + base64.b64encode(img).decode('utf-8')
0
Ramazan Polat