50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
#!/usr/bin/python
|
|
# esc-pos-image.py - print image files given as command line arguments
|
|
# to simple ESC-POS image on stdout
|
|
# scruss - 2014-07-26 - WTFPL (srsly)
|
|
|
|
# if you want a proper CUPS driver for a 58mm thermal printer
|
|
# that uses this command set, go here:
|
|
# https://github.com/klirichek/zj-58
|
|
|
|
import sys
|
|
from PIL import Image
|
|
import PIL.ImageOps
|
|
import struct
|
|
|
|
# give usage and exit if no arguments
|
|
if len(sys.argv) == 1:
|
|
print 'Usage:', sys.argv[0], \
|
|
'image1 image2 ... [ > printer_device ]'
|
|
exit(1)
|
|
|
|
# print all of the images!
|
|
for i in sys.argv[1:]:
|
|
im = Image.open(i)
|
|
|
|
# if image is not 1-bit, convert it
|
|
if im.mode != '1':
|
|
im = im.convert('1')
|
|
|
|
# if image width is not a multiple of 8 pixels, fix that
|
|
if im.size[0] % 8:
|
|
im2 = Image.new('1', (im.size[0] + 8 - im.size[0] % 8,
|
|
im.size[1]), 'white')
|
|
im2.paste(im, (0, 0))
|
|
im = im2
|
|
|
|
# Invert image, via greyscale for compatibility
|
|
# (no, I don't know why I need to do this)
|
|
im = PIL.ImageOps.invert(im.convert('L'))
|
|
# ... and now convert back to single bit
|
|
im = im.convert('1')
|
|
|
|
# output header (GS v 0 \000), width, height, image data
|
|
sys.stdout.write(''.join(('\x1d\x76\x30\x00',
|
|
struct.pack('2B', im.size[0] / 8 % 256,
|
|
im.size[0] / 8 / 256),
|
|
struct.pack('2B', im.size[1] % 256,
|
|
im.size[1] / 256),
|
|
im.tobytes())))
|
|
|