#!/usr/bin/python # png2escp.py # benutzt die PIL-Library import sys import time from PIL import Image import PIL.ImageOps import struct # Pruefen der Parameter if len(sys.argv) == 1: print 'Usage:', sys.argv[0], \ 'image1 image2 ... [ > printer_device ]' exit(1) # Druckerinitialisierung sys.stdout.write("\x1b@") # Setzt Papiertyp Label (Thermorolle) sys.stdout.write("\x12\x21\x05") # Setzt Druckdichte sys.stdout.write("\x12\x7e\x87") # Setzt Zeilenhoehe sys.stdout.write("\x1b\x33\x0a") # Konvertierung aller PNG-Dateien for i in sys.argv[1:]: im = Image.open(i) # konvertiert zu 1 Bit if im.mode != '1': im = im.convert('1') # Zeilenhoehe auf 24 Bit einstellen if im.size[1] % 24: im2 = Image.new('1', (im.size[0], im.size[1] + 24 - im.size[1] % 24), 'white') im2.paste(im, (0, 0)) im = im2 # Invertieren der Pixel im = PIL.ImageOps.invert(im.convert('L')) # erneute Fixierung auf 1 Bit im = im.convert('1') # rotiert Image um 90 Grad p_im=im.transpose(Image.ROTATE_90).transpose(Image.FLIP_TOP_BOTTOM) # Konvertierungsschleife for row in range(p_im.size[0]/24): strip=p_im.crop((row * 24, 0, (row + 1) * 24, p_im.size[1])) sys.stdout.write(''.join(('\x1b*\x21', struct.pack('2B',p_im.size[1] % 256, p_im.size[1] / 256), strip.tobytes()))) # gebe Buffer aus mit 0d sys.stdout.write("\x0D") # speichere Ausgabe zur Verifizierung und Test p_im.save("result.png", "png") # Line feed sys.stdout.write("\x0A\x0D") sys.stdout.flush()