2009-03-10 18 views
11

Wie codiert man ein Png-Bild in Base64 mit Python unter Windows?base64 png in Python unter Windows

iconfile = open("icon.png") 
icondata = iconfile.read() 
icondata = base64.b64encode(icondata) 

Die oben genannten funktioniert gut in Linux und OSX, aber unter Windows wird es die ersten paar Zeichen dann kurz schneiden. Warum ist das?

Antwort

26

Open the file in binary mode:

open("icon.png", "rb") 

ich unter Windows nicht sehr vertraut bin, aber ich kann mir vorstellen, was passiert, ist, dass die Datei ein Zeichen (0x1A) enthält, dass Windows is interpreting as the end of the file (für Legacy-Gründen), wenn es geöffnet wird im Textmodus. Das andere Problem ist, dass das Öffnen einer Datei im Textmodus (ohne 'b') unter Windows dazu führt, dass Zeilenenden neu geschrieben werden, was im Allgemeinen dazu führt, dass Binärdateien unterbrochen werden, wenn diese Zeichen nicht das Ende einer Zeile anzeigen.

+0

+1, weil es funktioniert. – Brian

+0

er ist in der Tat richtig, seltsam, wie es funktioniert ohne es in Linux/OSX – directedition

+0

Linus/OSX behandeln Binär-und Textdateien die gleiche, während Windows Carriage Return anders in Textdateien als in Binärdateien behandelt. Außerdem sollten Sie das Kontrollkästchen neben seiner Antwort aktivieren, um es als die richtige Antwort zu markieren. – Powerlord

9

Um die Antwort von Miles, die first eight bytes in a PNG file sind speziell zu ergänzen:

  • 89 - das erste Byte eine Prüfung ist, dass 8 Bit hat
  • "PNG" nicht beraubt worden - jemand lesen dass es ein PNG-Format
  • 0d 0a - der DOS-end-of-line Indikator, um zu überprüfen, ob es DOS-> Unix-Umwandlung
  • 1a war - das DOS End-of-Datei char acter, zu überprüfen, ob die Datei in Binärmodus
  • 0a geöffnet wurde - Unix-end-of-line-Charakter, zu überprüfen, ob es eine Unix-> DOS Umwandlung

Ihr Code stoppt war die 1a, wie geplant.