Advertisement
ijontichy

matrix.py

Sep 16th, 2012
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.67 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import sys, os
  4. import cgi, cgitb
  5. import random
  6. import string
  7. from PIL import Image, ImageDraw, ImageFont, ImageFilter
  8. from StringIO import StringIO
  9.  
  10. TERMINUS = ImageFont.load("terminus-bold.pil")
  11. WHITEMASK = lambda x, y: Image.new("L", (x, y), color=255)
  12. BLACKMASK = lambda x, y: Image.new("L", (x, y), color=0)
  13.  
  14. ADDFILTER = ImageFilter.MaxFilter(4)
  15. RANDCHARS = string.ascii_letters + string.digits + "!@#$%^&*;',.?/\\"
  16.  
  17. def matrix(cols, rows):
  18.     show        = [random.randint(128, 255) * (random.randint(0, 7) > 1) for i in range(cols)]
  19.     glow        = [0] * cols
  20.     delayedglow = [0] * cols
  21.     last        = [random.randint(1, 3) for i in range(cols)]
  22.  
  23.     for i in range(rows):
  24.         ret = []
  25.         char = ""
  26.        
  27.         for j in range(cols):
  28.             if show[j]:
  29.                 char = random.choice(RANDCHARS)
  30.             else:
  31.                 char = " "
  32.  
  33.             if glow[j]:
  34.                 show[j] = min(255, show[j] + random.randint(500 / rows, 1000 / rows) )
  35.             else:
  36.                 show[j] = min(255, show[j] - random.randint(4, last[j] * (400 / rows)) )
  37.  
  38.             show[j] = max(show[j], 0)
  39.  
  40.             glow[j] = max(glow[j] - 1, 0)
  41.             delayedglow[j] = max(delayedglow[j] - 1, 0)
  42.  
  43.             if show[j] < 32:
  44.                 if not random.randint(0, 30000 / rows):
  45.                     glow[j] = 10
  46.                     try:
  47.                         delayedglow[j-1] = 8
  48.                         delayedglow[j+1] = 8
  49.                     except IndexError:
  50.                         pass
  51.  
  52.                 elif not random.randint(0, 3000 / rows):
  53.                     glow[j] = 10
  54.  
  55.             if delayedglow[j] == 1: glow[j] = 8
  56.  
  57.             ret.append((char, show[j]))
  58.  
  59.         yield ret
  60.  
  61.     raise StopIteration
  62.  
  63. def generateImage(width, height, font, alpha=128):
  64.     bigwidth, bigheight   = width * 2, height * 2
  65.     fontwidth, fontheight = font.getsize(" ")
  66.  
  67.     ret  = Image.new("RGBA", (bigwidth, bigheight), color=(0, 0, 0, alpha))
  68.     ret1 = Image.new("RGBA", (bigwidth, bigheight), color=(128, 255, 128, 255))
  69.     ret2 = Image.new("RGBA", (bigwidth, bigheight), color=(0,   255, 0,   255))
  70.  
  71.     mask = BLACKMASK(bigwidth, bigheight)
  72.  
  73.     canvas = ImageDraw.Draw(mask)
  74.  
  75.     for i, layer in enumerate(matrix(bigwidth / fontwidth, (bigheight / fontheight) + 2)):
  76.        
  77.         for j, (char, alpha) in enumerate(layer):
  78.             canvas.text((2 + (fontwidth * j), 2 + (fontheight * i)), char, font=font, fill=alpha)
  79.  
  80.     blurred = mask.filter(ImageFilter.BLUR)
  81.  
  82.     ret1.putalpha(mask)
  83.     ret2.putalpha(blurred)
  84.  
  85.     ret1flat = ret1.convert("RGB")
  86.     ret2flat = ret2.convert("RGB")
  87.  
  88.     ret.paste(ret2flat, (0, 0), ret2)
  89.     ret.paste(ret1flat, (0, 0), ret1)
  90.  
  91.     resized = ret.resize((width, height), Image.BICUBIC)
  92.    
  93.     #return ret
  94.     return resized
  95.  
  96. def norMain():
  97.     img = generateImage(200, 200, TERMINUS)
  98.     img.save("test.png")
  99.  
  100. def cgiMain():
  101.     form = {}
  102.     cgiforms = cgi.FieldStorage()
  103.     size  = 125
  104.     alpha = 256
  105.  
  106.     for val in cgiforms:
  107.         form[val.lower()] = cgiforms[val].value
  108.  
  109.     if "alpha" in form:
  110.         try:
  111.             alpha = int(form["alpha"])
  112.         except ValueError:
  113.             pass
  114.  
  115.     if "size" in form:
  116.         try:
  117.             size = int(form["size"])
  118.         except ValueError:
  119.             pass
  120.  
  121.     size = max(50, size)
  122.     size = min(size, 300)
  123.  
  124.     alpha = max(0, alpha)
  125.     alpha = min(alpha, 255)
  126.  
  127.     output = StringIO()
  128.     img = generateImage(size, size, TERMINUS, alpha=alpha)
  129.     img.save(output, "PNG")
  130.  
  131.     print("Content-type: image/png\n")
  132.     print(output.getvalue())
  133.  
  134. if __name__ == "__main__":
  135.  
  136.     if "REMOTE_ADDR" in os.environ:
  137.         cgitb.enable()
  138.         cgiMain()
  139.  
  140.     else:
  141.         norMain()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement