2017-02-28 3 views
3

für die letzten paar Stunden habe ich versucht, eine Base64-String eines Bildes zu erstellen, aber es wird nicht funktionieren.Wie bekomme ich ein PIL-Bild als Base64-codierte Zeichenfolge

ship_color = (0,100,100,255) 
img = Image.new("RGBA", (100,100)) 
for i in range(20): 
    for j in range(20): 
     img.putpixel((40 + i, 40 + j), ship_color) 
img.save("tmp.png", format = "PNG") 
im = open("tmp.png", "rb").read() 
print(im) 
base = base64.b64encode(im) 
print(base) 

Wenn ich versuche, ein Bild aus dem String zu erstellen wieder bekomme ich eine Ausnahme:

img2 = Image.frombytes("RGBA", (100, 100), base) 
ValueError: not enough image data 

Andere Online-Dienste für Base64-Decodierung auch einen Fehler geben, so dass der base64 String selbst scheint nicht zu sei richtig.

Beispielbild String (von open()() gelesen.):

b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00d\x00\x00\x00d\x08\x02\x00\x00\x00\xff\x80\x02\x03\x00\x00\x00lIDATx\x9c\xed\xd0\xd1\t\x800\x10\x05\xc1h\xad)+\xc5Z\xc3\x8a\x10"3\xff\xc7;v\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008\xc7\xb5my\xce\xf7\xb7k}\xf7GpoY=\x94X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0S\x0fX\xb7\x02(\x90HP\xa2\x00\x00\x00\x00IEND\xaeB`\x82' 

Beispiel base64 String:

b'iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAAbElEQVR4nO3Q0QmAMBAFwWitKSvFWsOKECIz/8c7dgwAAAAAAAAAAAAAADjHtW15zve3a333R3BvWT2UWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgVgAAAAAAAAAAAAAAPBTD1i3AiiQSFCiAAAAAElFTkSuQmCC' 
+0

Wo ist das Bit, wo Sie base64 ** kodieren ** Ihre Daten? –

+0

Was @AlastairMcCormack sagt, Sie verwenden 'base64.b64decode (im)' um ** das Bild ** zu verschlüsseln. – Robert

+0

@Robert meine schlechte, falsche Methode ^^ immer noch b64encode gibt die gleiche Ausnahme –

Antwort

4

Sie müssen kodieren base64, bevor Sie dekodieren kann.

Sie können dies erreichen, ohne durch die Verwendung einer in Speicherdatei eine temporäre Datei zu erstellen, mit io.BytesIO()

in_mem_file = io.BytesIO() 
img.save(in_mem_file, format = "PNG") 
# reset file pointer to start 
in_mem_file.seek(0) 
img_bytes = in_mem_file.read() 

base64_encoded_result_bytes = base64.b64encode(img_bytes) 
base64_encoded_result_str = base64_encoded_result_bytes.decode('ascii') 
+0

Danke ich habe es jetzt funktioniert. Am Ende war das Problem das b '' Präfix einer Byte-Repräsentation in Python, also musste ich es zuerst in eine Zeichenkette umwandeln und dann die ersten paar Zeichen abschneiden. Für alle neugierig: 'base = base64.b64encode (im) base.decode() base = str (Basis) Basis = Basis [2: len (Basis) - 1]' hat es für mich –

+0

nein , Nein. das ist der falsche Weg. Sie müssen einfach das Byte-Objekt als Text mit 'ascii' dekodieren(). Das Ergebnis ist ein str. Siehe aktualisierte Antwort. –

0

Image.frombytes() kein Bild von einer Base64-codierten Zeichenfolge erstellen, siehe documentation .

Wenn Sie die Codierung rückgängig zu machen, verwenden:

img2 = base64.b64decode(base) 
Verwandte Themen