import socket import random import time from PIL import Image from random import shuffle import numpy as np import sys TCP_IP = '94.45.232.48' TCP_PORT = 1234 BUFFER_SIZE = 4096 flutwidth = 1920 flutheight = 1080 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((TCP_IP, TCP_PORT)) image=sys.argv[1] #image name #Load the Image im = Image.open(image) rgb_im = im.convert('RGBA') width, height = im.size #get image size def randomnumber(pseed,pmin,pmax,v1,v2,v3): return (pseed*v1+pseed^2*v2+pseed^3*v3)%(pmax-pmin)+pmin newseed=(int)(time.time()/60) #seed based on timestamp (full minutes) seed=newseed user=int(sys.argv[2]) #1..n parts=int(sys.argv[3]) #n users if __name__ == '__main__': pixelcoords=[] for _x in range(width): for _y in range(height): pixelcoords+=[(_x,_y)] random.seed(42) random.shuffle(pixelcoords) #pseudorandom order print(pixelcoords) pixelcoords=pixelcoords[int(len(pixelcoords)/parts)*(user-1):int(len(pixelcoords)/parts)*(user)] #divide in parts for multiple connection while True: #Mainloop starttime=time.time() commandsarray=[] seed=newseed print("Seed: "+str(seed)) xv=randomnumber(seed,width/2,flutwidth-width/2, 42,-24,4) #x position of image yv=randomnumber(seed,height/2,flutheight-height/2, 43,-23,3) #y "" print("xv="+str(xv)+ "yv="+str(yv)) _current_command="" for i,j in pixelcoords: #i,j as xy coordinates from image r, g, b,a = rgb_im.getpixel((i, j)) #Do stupid stuffz with p1x3ls if a<=127: continue #if r>127: # continue #skip bright pixels _current_command+='PX %d %d %02x%02x%02x\n' % (i+xv-width/2,j+yv-height/2,r,g,b) #rgb #_current_command+='PX %d %d %02x\n' % (i+xv-width/2,j+yv-height/2,r) #monochrome only red channel if len(_current_command)>=1400: #divide in packets smaller than 1500 byte commandsarray+=[_current_command.encode()] #append packet _current_command="" commandsarray+=[_current_command.encode()] #append last packet print("Generated Commands in "+str(time.time()-starttime)+" seconds") while seed==newseed: #as long as position did not change try: starttime=time.time() for command in commandsarray: s.send(command) print("Send Image in "+str(time.time()-starttime)+" seconds") except BrokenPipeError: #Brokn Pipe? Reconnect!! print("BrokenPipeError. Reconnecting") s.close() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((TCP_IP, TCP_PORT)) #reconnect print("reconnected") newseed=(int)(time.time()/60) exit()