2009-03-10 40 views
11

Làm cách nào để mã hóa hình ảnh png thành base64 bằng python trên Windows?base64 png trong python trên Windows

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

Các công trình trên tốt trong Linux và OSX, nhưng trên Windows nó sẽ mã hóa một vài ký tự đầu tiên sau đó cắt ngắn. Tại sao điều này?

Trả lời

26

Open the file in binary mode:

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

Tôi không phải là rất quen thuộc với Windows, nhưng tôi muốn tưởng tượng những gì đang xảy ra là các tập tin chứa một ký tự (0x1A) mà Windows is interpreting as the end of the file (vì lý do di sản) khi nó được mở ở chế độ văn bản. Vấn đề khác là việc mở một tệp ở chế độ văn bản (không có 'b') trên Windows sẽ làm cho kết thúc dòng được viết lại, thường sẽ phá vỡ các tệp nhị phân mà các ký tự đó không thực sự biểu thị kết thúc của một dòng.

+0

+1 bởi vì nó hoạt động. – Brian

+0

ông thực sự là chính xác, lẻ như thế nào nó hoạt động tốt mà không có nó trong linux/osx – directedition

+0

Linus/OSX xử lý nhị phân và các tập tin văn bản giống nhau, trong khi Windows xử lý vận chuyển trở lại khác nhau trong các tập tin văn bản hơn trong các tập tin nhị phân. Ngoài ra, bạn nên nhấp vào hộp kiểm bên cạnh câu trả lời của mình để đánh dấu nó là câu trả lời đúng. – Powerlord

9

Để tăng cường cho câu trả lời từ Miles, các first eight bytes in a PNG file được thiết kế đặc biệt:

  • 89 - byte đầu tiên là một tấm séc mà chút 8 chưa được lột
  • "PNG" - để cho người đọc rằng đó là một định dạng PNG
  • 0d 0a - DOS end-of-line chỉ thị, để kiểm tra xem có là DOS-> unix chuyển đổi
  • 1a - DOS end-of-file char acter, để kiểm tra xem các tập tin được khai trương vào chế độ nhị phân
  • 0a - unix end-of-line nhân vật, để kiểm tra nếu có một unix-> DOS chuyển đổi

Mã của bạn dừng lại ở 1a, như được thiết kế.

Các vấn đề liên quan