Pixelflut: Unterschied zwischen den Versionen

Aus Wiki CCC Göttingen
Zur Navigation springen Zur Suche springen
Zeile 59: Zeile 59:
       y += random.randint(0,2)-1
       y += random.randint(0,2)-1
       n -= 1
       n -= 1
  from PIL import Image
  im = Image.open('test.png').convert('RGB')
  im.thumbnail((200,300), Image.ANTIALIAS)
  _,_,w,h = im.getbbox()
 
  for x in xrange(w):
    for y in xrange(h):
      r,g,b = im.getpixel((x,y))
      pixel(x,y,r,g,b)

Version vom 24. April 2012, 13:29 Uhr


Pixel Flut

Random Step + Testbild

Experimente mit grafischen Algorithmen sind nur halb so spaßig, wenn man sie niemandem zeigen kann. Pixelflut bringt die Pixel von jedem im Netzwerk auf die selbe Leinwand (Beamer, LCD). Das Protokoll ist simpel, die Möglichkeiten begrenzt, aber genau das ist ja die Herausforderung.

Der Server wird über TCP/IP angesprochen und versteht ASCII Befehle (einen pro Zeile).

   # Setze ein weißes Pixel an die Position 20,30 (x,y)
   $ echo -en 'PX 20 30 255 255 255\n' | netcat -q1 10.23.43.107 2342
   # Setze ein orangefarbenes Pixel, aber nur mit 50% deckung
   $ echo -en 'PX 20 30 255 128 0 128\n' | netcat -q1 10.23.43.107 2342
   # Lese den Farbwert eines Pixels
   $ echo -en 'PX 20 30\n' | netcat -q1 10.23.43.107 2342
   PX 20 30 255 192 128

Code Sammlung

Bash

  # y=0; cat a.xpm | while read l ; do i=0 ;x=0; max=${#l}; echo $max ; while [ $i -ne $max ] ;\
       do b=`echo ${l:i:1}` ; echo $b $i $y ;if [ "$b" == "." ] ;\
       then echo test ; echo  "px $i $y" ; fi ; let i++ ;echo $i; done;\
       let y++ ; done | grep "px" |netcat 10.23.42.107 2342 \
       # bei dieser  Version muss noch der header aus dem XPM File entfernt werden

Python

Primitiver client in Python (ready for copy/paste)

 import socket
 HOST = '10.23.42.107'
 PORT = 2342
 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 sock.connect((HOST, PORT))
 send = sock.send
 
 def pixel(x,y,r,g,b,a=255):
   if a == 255:
     send('PX %d %d %d %d %d\n' % (x,y,r,g,b))
   else:
     send('PX %d %d %d %d %d %d\n' % (x,y,r,g,b,a))
 def rect(x,y,w,h,r,g,b):
  for i in xrange(x,x+w):
    for j in xrange(y,y+h):
      pixel(i,j,r,g,b)
 import random
   
 def worm(x,y,n,r,g,b):
   while n:
     pixel(x,y,r,g,b,25)
     x += random.randint(0,2)-1
     y += random.randint(0,2)-1
     n -= 1
 from PIL import Image
 im = Image.open('test.png').convert('RGB')
 im.thumbnail((200,300), Image.ANTIALIAS)
 _,_,w,h = im.getbbox()
 
 for x in xrange(w):
   for y in xrange(h):
     r,g,b = im.getpixel((x,y))
     pixel(x,y,r,g,b)