add function to print full images including resizing and fix band printing

This commit is contained in:
Thomas van den Berg 2013-02-27 15:10:34 +01:00 committed by Patrick Kanzler
parent 1614298863
commit 598c893943
4 changed files with 55 additions and 1 deletions

View File

@ -1 +1,2 @@
import constants, escpos, exceptions, printer
__all__ = ["constants", "escpos", "exceptions", "printer"] __all__ = ["constants", "escpos", "exceptions", "printer"]

View File

@ -18,6 +18,8 @@ import qrcode
import time import time
import textwrap import textwrap
import binascii import binascii
import os
import operator
from .constants import * from .constants import *
from .exceptions import * from .exceptions import *
@ -161,6 +163,42 @@ class Escpos(object):
# Convert the RGB image in printable image # Convert the RGB image in printable image
self._convert_image(im) self._convert_image(im)
def fullimage(self, img, max_height=860, width=512, histeq=True):
""" Resizes and prints an arbitrarily sized image """
if isinstance(img, (Image, Image.Image)):
im = img.convert("RGB")
else:
im = Image.open(img).convert("RGB")
if histeq:
# Histogram equaliztion
h = im.histogram()
lut = []
for b in range(0, len(h), 256):
# step size
step = reduce(operator.add, h[b:b+256]) / 255
# create equalization lookup table
n = 0
for i in range(256):
lut.append(n / step)
n = n + h[i+b]
im = im.point(lut)
ratio = float(width) / im.size[0]
newheight = int(ratio * im.size[1])
# Resize the image
im = im.resize((width, newheight), Image.ANTIALIAS)
if im.size[1] > max_height:
im = im.crop((0, 0, im.size[0], max_height))
# Divide into bands
bandsize = 255
current = 0
while current < im.size[1]:
self.image(im.crop((0, current, width, min(im.size[1], current + bandsize))))
current += bandsize
def direct_image(self, image): def direct_image(self, image):
""" Send image to printer """ Send image to printer

View File

@ -11,6 +11,7 @@ Result/Exit codes:
- `60` = Invalid pin to send Cash Drawer pulse :py:exc:`~escpos.exceptions.CashDrawerError` - `60` = Invalid pin to send Cash Drawer pulse :py:exc:`~escpos.exceptions.CashDrawerError`
- `70` = Invalid number of tab positions :py:exc:`~escpos.exceptions.TabPosError` - `70` = Invalid number of tab positions :py:exc:`~escpos.exceptions.TabPosError`
- `80` = Invalid char code :py:exc:`~escpos.exceptions.CharCodeError` - `80` = Invalid char code :py:exc:`~escpos.exceptions.CharCodeError`
- `90` = USB device not found :py:exc:`~escpos.exceptions.USBNotFoundError`
:author: `Manuel F Martinez <manpaz@bashlinux.com>`_ and others :author: `Manuel F Martinez <manpaz@bashlinux.com>`_ and others
:organization: Bashlinux and `python-escpos <https://github.com/python-escpos>`_ :organization: Bashlinux and `python-escpos <https://github.com/python-escpos>`_
@ -151,3 +152,17 @@ class CharCodeError(Error):
def __str__(self): def __str__(self):
return "Valid char code must be set" return "Valid char code must be set"
class USBNotFoundError(Error):
""" Device wasn't found (probably not plugged in)
The USB device seems to be not plugged in.
Ths returncode for this exception is `90`.
"""
def __init__(self, msg=""):
Error.__init__(self, msg)
self.msg = msg
self.resultcode = 90
def __str__(self):
return "USB device not found"

View File

@ -43,7 +43,7 @@ class Usb(Escpos):
""" Search device on USB tree and set it as escpos device """ """ Search device on USB tree and set it as escpos device """
self.device = usb.core.find(idVendor=self.idVendor, idProduct=self.idProduct) self.device = usb.core.find(idVendor=self.idVendor, idProduct=self.idProduct)
if self.device is None: if self.device is None:
print("Cable isn't plugged in") raise USBNotFoundError("Device not found or cable not plugged in.")
check_driver = None check_driver = None