mirror of
https://github.com/furrtek/PrecIR.git
synced 2026-05-11 03:57:06 +00:00
Experimental color support in img2dm
This commit is contained in:
+55
-39
@@ -7,6 +7,21 @@ import tx
|
||||
from imageio import imread
|
||||
import sys
|
||||
|
||||
bytes_per_frame = 20
|
||||
bits_per_frame = bytes_per_frame * 8
|
||||
|
||||
def image_convert(image, color_pass):
|
||||
pixels = []
|
||||
for row in image:
|
||||
for rgb in row:
|
||||
luma = 0.21 * rgb[0] + 0.72 * rgb[1] + 0.07 * rgb[2]
|
||||
if color_pass:
|
||||
pixels.append(0 if luma >= 0.33 and luma < 0.66 else 1) # 0 codes color (anything mid grey)
|
||||
else:
|
||||
pixels.append(0 if luma < 0.5 else 1) # 0 codes black
|
||||
|
||||
return pixels
|
||||
|
||||
def record_run(run_count):
|
||||
# Convert to binary
|
||||
del bits[:]
|
||||
@@ -22,18 +37,27 @@ def record_run(run_count):
|
||||
def usage():
|
||||
print("img2dm - Transmits image to Dot Matrix ESL\n")
|
||||
print("Usage:")
|
||||
print("img2dm.py port image barcode page (x y)\n")
|
||||
print("img2dm.py port image barcode (page color x y)\n")
|
||||
print(" port: serial port name (0 for ESL Blaster)")
|
||||
print(" image: image file")
|
||||
print(" barcode: 17-character barcode data")
|
||||
print(" page: page number to update (0~15)")
|
||||
print(" page: page number to update (0~15), default: 0")
|
||||
print(" color: 0:Black and white only, 1:Color-capable ESL, default: 0")
|
||||
print(" x y: top-left position of image, default: 0 0")
|
||||
exit()
|
||||
|
||||
arg_count = len(sys.argv)
|
||||
if arg_count < 5:
|
||||
if arg_count < 4:
|
||||
usage()
|
||||
|
||||
if arg_count >= 5:
|
||||
page = int(sys.argv[4])
|
||||
if page < 0 or page > 15:
|
||||
print("Page must be between 0 and 15.")
|
||||
exit()
|
||||
else:
|
||||
page = 0
|
||||
|
||||
port = sys.argv[1]
|
||||
|
||||
# Search for connected ESL Blaster if required
|
||||
@@ -46,39 +70,28 @@ if (port == "0"):
|
||||
image = imread(sys.argv[2])
|
||||
width = image.shape[1]
|
||||
height = image.shape[0]
|
||||
if width > 208 or height > 112:
|
||||
print("Image should be 208*112 pixels or less.")
|
||||
exit()
|
||||
# Medium size is 208*112
|
||||
print("Image is %i*%i, please make sure that this is equal or less than the ESL's display size." % (width, height))
|
||||
|
||||
# Get PLID from barcode string
|
||||
PLID = pr.get_plid(sys.argv[3])
|
||||
|
||||
page = int(sys.argv[4])
|
||||
if page < 0 or page > 15:
|
||||
print("Page can only be between 0 and 15.")
|
||||
exit()
|
||||
color_mode = int(sys.argv[5]) if arg_count >= 6 else 0
|
||||
pos_x = int(sys.argv[6]) if arg_count >= 7 else 0
|
||||
pos_y = int(sys.argv[7]) if arg_count >= 8 else 0
|
||||
|
||||
if arg_count > 5:
|
||||
pos_x = int(sys.argv[5])
|
||||
else:
|
||||
pos_x = 0
|
||||
if arg_count > 6:
|
||||
pos_y = int(sys.argv[6])
|
||||
else:
|
||||
pos_y = 0
|
||||
# First pass for black and white
|
||||
pixels = image_convert(image, 0)
|
||||
|
||||
bits = []
|
||||
size_raw = width * height
|
||||
if color_mode:
|
||||
# Append second pass for color if needed
|
||||
pixels += image_convert(image, 1)
|
||||
|
||||
# Convert image to 1-bit
|
||||
pixels = []
|
||||
for row in image:
|
||||
for rgb in row:
|
||||
pixels.append(int(round((0.21 * rgb[0] + 0.72 * rgb[1] + 0.07 * rgb[2]) / 255)))
|
||||
|
||||
print("Compressing %i pixels..." % size_raw)
|
||||
size_raw = len(pixels)
|
||||
print("Compressing %i bits..." % size_raw)
|
||||
|
||||
# First pixel
|
||||
bits = []
|
||||
compressed = []
|
||||
run_pixel = pixels[0]
|
||||
run_count = 1
|
||||
@@ -100,6 +113,7 @@ if run_count > 1:
|
||||
size_compressed = len(compressed)
|
||||
|
||||
# Decide on compression or not
|
||||
# size_compressed = size_raw # Disable compression
|
||||
if size_compressed < size_raw:
|
||||
print("Compression ratio: %.1f%%" % (100 - ((size_compressed * 100) / float(size_raw))))
|
||||
data = compressed
|
||||
@@ -110,7 +124,6 @@ else:
|
||||
compression_type = 0
|
||||
|
||||
# Pad data to multiple of bits_per_frame
|
||||
bits_per_frame = 20 * 8
|
||||
data_size = len(data)
|
||||
padding = bits_per_frame - (data_size % bits_per_frame)
|
||||
for b in range(0, padding):
|
||||
@@ -119,17 +132,19 @@ for b in range(0, padding):
|
||||
padded_data_size = len(data)
|
||||
frame_count = padded_data_size // bits_per_frame
|
||||
|
||||
print("Data size: %i (%i frames)" % (data_size, frame_count))
|
||||
|
||||
frames = []
|
||||
|
||||
# Ping frame
|
||||
# Wake-up ping frame
|
||||
frames.append(pr.make_ping_frame(PLID, 400))
|
||||
|
||||
print("Generating %i data frames..." % frame_count)
|
||||
print("Generating frames...")
|
||||
|
||||
# Parameters frame
|
||||
frame = pr.make_mcu_frame(PLID, 0x05)
|
||||
pr.append_word(frame, data_size // 8) # Byte count
|
||||
frame.append(0x00) # Unused
|
||||
pr.append_word(frame, data_size // 8) # Total byte count for group
|
||||
frame.append(0x00) # Unused
|
||||
frame.append(compression_type)
|
||||
frame.append(page)
|
||||
pr.append_word(frame, width)
|
||||
@@ -148,7 +163,7 @@ i = 0
|
||||
for fr in range(0, frame_count):
|
||||
frame = pr.make_mcu_frame(PLID, 0x20)
|
||||
pr.append_word(frame, fr)
|
||||
for by in range(0, 20):
|
||||
for by in range(0, bytes_per_frame):
|
||||
v = 0
|
||||
# Bit string to byte
|
||||
for bi in range(0, 8):
|
||||
@@ -163,12 +178,13 @@ for fr in range(0, frame_count):
|
||||
frames.append(pr.make_refresh_frame(PLID))
|
||||
|
||||
# DEBUG
|
||||
#f = open("out.txt", "w")
|
||||
#for fr in frames:
|
||||
# for b in fr:
|
||||
# f.write(format(b, '02X') + " ")
|
||||
# f.write("\n")
|
||||
#exit()
|
||||
f = open("frames.txt", "w")
|
||||
for fr in frames:
|
||||
for b in fr:
|
||||
f.write(format(b, '02X') + " ")
|
||||
f.write("\n")
|
||||
|
||||
input("Place ESL in front of transmitter and press any key.")
|
||||
|
||||
# Send data to IR transmitter
|
||||
if (port == "0"):
|
||||
|
||||
+1
-1
@@ -48,7 +48,7 @@ def get_plid(barcode):
|
||||
return PLID
|
||||
|
||||
def make_ping_frame(PLID, repeats):
|
||||
frame = make_raw_frame(0x85, PLID, 0x17)
|
||||
frame = make_raw_frame(0x85, PLID, 0x17) # 0x97 ?
|
||||
frame.append(0x01)
|
||||
frame.append(0x00)
|
||||
frame.append(0x00)
|
||||
|
||||
Reference in New Issue
Block a user