From 0d5b013fbc61a67fed82a5e3dd2e4d5414128ba2 Mon Sep 17 00:00:00 2001 From: Fisch Date: Sat, 31 Mar 2018 13:18:18 +0200 Subject: [PATCH] more efficient --- ctdo.png | Bin 8174 -> 8169 bytes eh18-image.py | 68 +++++++++++++++++++++++++++++++++++++------------- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/ctdo.png b/ctdo.png index 3a9881266fc7458949b4d6dd5b88d050589d4d07..72b3cc8f12466321b51229129c1f2c1ded5fce37 100644 GIT binary patch literal 8169 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 UXPfRk8UO$Q07*qoM6N<$f-AF2@c;k- diff --git a/eh18-image.py b/eh18-image.py index 76e7753..0b35a27 100644 --- a/eh18-image.py +++ b/eh18-image.py @@ -2,6 +2,8 @@ import socket import random import time from PIL import Image +from random import shuffle +import numpy as np TCP_IP = '94.45.232.48' TCP_PORT = 1234 @@ -21,26 +23,58 @@ c = '000000' im = Image.open("ctdo.png") rgb_im = im.convert('RGB') +commandsarray=[] if __name__ == '__main__': - for a in range(100000): - #xv=random.randint(0,flutwidth) - #yv=random.randint(0,flutheight) - xv=flutwidth-width/2 - yv=height/2 - for i in range(width): - pixel_x=i-width/2+xv - for j in range(height): - pixel_y=j-height/2+yv - #v1=hex(random.randint(0,255))[2:] - #c=v1+v1+v1 - r, g, b = rgb_im.getpixel((i, j)) + starttime=time.time() + #xv=random.randint(0,flutwidth) + #yv=random.randint(0,flutheight) + xv=300 + yv=flutheight-height-100 + _current_command="" + + pixelcoords=[] + for _x in range(width): + for _y in range(height): + pixelcoords+=[(_x,_y)] + + shuffle(pixelcoords) - #c=hex(r)+hex(g)+hex(b) - #c=hex(r) - #s.send("PX {0} {1} {2}\n".format(pixel_x, pixel_y, c)) - s.send( ('PX %d %d %02x%02x%02x\n' % (pixel_x,pixel_y,r,g,b)).encode()) - print(".") + + + for i,j in pixelcoords: + r, g, b = rgb_im.getpixel((i, j)) + #if r>127: + # continue #skip bright pixels + #r=255-r + + #_current_command+='PX %d %d %02x%02x%02x\n' % (i+xv,j+yv,r,g,b) #rgb + _current_command+='PX %d %d %02x\n' % (i+xv,j+yv,r) #monochrome only red channel + if len(_current_command)>=1400: + 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 True: + try: + starttime=time.time() + for command in commandsarray: + + s.send(command) + + + print("Send Image in "+str(time.time()-starttime)+" seconds") + except BrokenPipeError: + print("BrokenPipeError. Reconnecting") + s.close() + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((TCP_IP, TCP_PORT)) #reconnect + print("reconnected") + exit()