kglobe/kitty.py
2025-07-17 23:17:56 +02:00

44 lines
1.2 KiB
Python
Executable File

#!/usr/bin/env python3
import sys
from base64 import standard_b64encode
from io import BytesIO
from PIL import Image, ImageDraw
def draw_to_terminal(img: Image.Image) -> None:
buffer: BytesIO = BytesIO()
img.save(buffer, format='PNG')
write_chunked(a='T', f=100, data=buffer.getvalue())
def serialize_gr_command(**cmd):
payload = cmd.pop('payload', None)
cmd = ','.join(f'{k}={v}' for k, v in cmd.items())
ans = []
w = ans.append
w(b'\033_G'), w(cmd.encode('ascii'))
if payload:
w(b';')
w(payload)
w(b'\033\\')
return b''.join(ans)
def write_chunked(**cmd):
data = standard_b64encode(cmd.pop('data'))
while data:
chunk, data = data[:4096], data[4096:]
m = 1 if data else 0
sys.stdout.buffer.write(serialize_gr_command(payload=chunk, m=m,
**cmd))
sys.stdout.flush()
cmd.clear()
if __name__ == '__main__':
i = Image.new("RGB", (100, 100), (0, 0, 0))
d = ImageDraw.Draw(i)
d.ellipse([(5, 5), (95, 95)])
d.ellipse([(10, 10), (90, 90)])
d.line(((50, 0), (50, 100)))
d.line(((0, 50), (100, 50)))
draw_to_terminal(i)