Here's a script I made from my original script for use on the command line. You can shrink images, set delays between pings (-w) etc.
import time, argparse
from PIL import Image
from icmplib import ping
import numpy as np
p = argparse.ArgumentParser(description = 'Draws image to IPv6 canvas.')
p.add_argument('filename', type = str)
p.add_argument('pos', type = int, default = (0, 0), nargs = 2)
p.add_argument('--scale', type = int, default = 1)
p.add_argument('--prefix', type = str, default = "senko")
p.add_argument('-w', type = float, default = 0.0003)
p.add_argument('-t', type = int, default = 0)
p.add_argument('--mask', type = int, nargs = 3, default = None)
p.add_argument('--mask_t', type = int, nargs = 2, default = [10, 50])
args = p.parse_args()
named_nets = {"zipdox": "2a01:4f8:1c1e:85cd", "senko": "2a01:4f8:a0:312c"}
prefix = named_nets[args.prefix] if args.prefix in named_nets else args.prefix
wait = args.w
timeout = args.t
mask = args.mask
mask_t, mask_T = args.mask_t
img = np.asarray(Image.open(args.filename))
size = img.shape
s = args.scale
def alpha(rgba):
a = rgba[3] if len(rgba) == 4 else 255
if mask is None:
return a
dist = np.linalg.norm(rgba[0:3] - mask)
a = int(((dist - mask_t) * a) // (mask_T - mask_t))
return max(0, min(a, 255))
for x in range(size[0] // s):
for y in range(size[1] // s):
pixel = np.average(img[x*s:(x+1)*s,y*s:(y+1)*s],axis=(0,1)).astype(np.uint8)
r,g,b = pixel[0:3]
a = alpha(pixel)
host = f"{prefix}:{args.pos[0] + y:04x}:{args.pos[1] + x:04x}:{r:02x}{g:02x}:{b:02x}{a:02x}"
while a:
response = ping(host, count = 1, privileged = False, timeout = timeout)
if timeout == 0 or response.packets_received > 0:
break
time.sleep(wait)