print image files to thermal printer ESC-POS on stdout
#!/usr/bin/env python3 | |
# 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) | |
# - 2021-01-09 (made python3 compatible - tvm Carko!) | |
# 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.buffer.write(b''.join((bytearray(b'\x1d\x76\x30\x00'), | |
struct.pack('2B', int(im.size[0] / 8) % 256, | |
int(im.size[0] / (8 * 256))), | |
struct.pack('2B', im.size[1] % 256, | |
int(im.size[1] / 256)), | |
im.tobytes()))) |
This comment has been minimized.
This comment has been minimized.
what license is this? |
This comment has been minimized.
This comment has been minimized.
This is the licence: WTFPL. |
This comment has been minimized.
This comment has been minimized.
Very lovely! Worked like nothing has ever have before in blueooth. |
This comment has been minimized.
This comment has been minimized.
Glad you like it! One day I'll update it to Python 3, but the bytes vs utf8 bit seems like work |
This comment has been minimized.
This comment has been minimized.
I made some changes to make it work with Pyton 3: https://gist.github.com/Carko/1507260d13eaa3e7cea6cecb713caca0 |
This comment has been minimized.
This comment has been minimized.
Much appreciated, Carko! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
explanation here: Notes on mini-printers and Linux … but these days, you probably want to use the klirichek/zj-58 driver.