Experimental color support in img2dm

This commit is contained in:
Furrtek
2022-12-22 04:26:57 +01:00
parent 63b06d6bc6
commit 23df6baeeb
4 changed files with 58 additions and 40 deletions
+55 -39
View File
@@ -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
View File
@@ -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)