Files
eink-dairy/generate_image.py
2025-12-28 21:59:59 -05:00

91 lines
2.6 KiB
Python

import sys
import socket
import time
from PIL import Image, ImageDraw, ImageFont
if len(sys.argv) < 2:
print("Usage: python3 generate_image.py <IP_ADDRESS> [TEXT]")
sys.exit(1)
IP_ADDRESS = sys.argv[1]
PORT = 4242
TEXT_TO_DRAW = sys.argv[2] if len(sys.argv) > 2 else "Hello from Python!"
WIDTH = 400
HEIGHT = 300
# Create a new image with white background (1 = White, 0 = Black)
image = Image.new('1', (WIDTH, HEIGHT), 1)
draw = ImageDraw.Draw(image)
print("Generating pattern...")
# Draw Borders
draw.rectangle([(0, 0), (WIDTH-1, HEIGHT-1)], outline=0, width=3)
# Draw Diagonal Cross
draw.line([(0, 0), (WIDTH-1, HEIGHT-1)], fill=0, width=2)
draw.line([(0, HEIGHT-1), (WIDTH-1, 0)], fill=0, width=2)
# Draw a filled box in the center
center_x = WIDTH // 2
center_y = HEIGHT // 2
box_size = 50
draw.rectangle([(center_x - box_size, center_y - box_size),
(center_x + box_size, center_y + box_size)], fill=0)
# Draw Text
try:
# Try to load a nice font
# On macOS, Arial is usually available.
font = ImageFont.truetype("/Library/Fonts/Arial.ttf", 36)
except IOError:
try:
# Try Linux path
font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 36)
except IOError:
print("Warning: Could not load custom font, using default.")
font = ImageFont.load_default()
# Calculate text size
try:
# Pillow >= 9.2.0
left, top, right, bottom = draw.textbbox((0, 0), TEXT_TO_DRAW, font=font)
text_width = right - left
text_height = bottom - top
except AttributeError:
# Older Pillow
text_width, text_height = draw.textsize(TEXT_TO_DRAW, font=font)
text_x = (WIDTH - text_width) // 2
text_y = 40 # Top area
# Draw white background for text so it's readable
padding = 10
draw.rectangle([(text_x - padding, text_y - padding),
(text_x + text_width + padding, text_y + text_height + padding)],
fill=1, outline=0)
# Draw text
draw.text((text_x, text_y), TEXT_TO_DRAW, font=font, fill=0)
# Convert to bytes
# PIL tobytes for mode '1' packs 8 pixels per byte, MSB first.
buffer = image.tobytes()
print(f"Connecting to {IP_ADDRESS}:{PORT}...")
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((IP_ADDRESS, PORT))
print("Connected. Sending command...")
s.sendall(b"/image\n")
time.sleep(0.5) # Small delay to ensure command is processed
print(f"Sending {len(buffer)} bytes of image data...")
s.sendall(buffer)
time.sleep(1)
print("Done.")
except Exception as e:
print(f"Error: {e}")