Advertisement
ijontichy

matrix.py

Sep 15th, 2012
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.12 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.     last = [random.randint(1, 3) for i in range(cols)]
  20.     glow = 0
  21.  
  22.     for i in range(rows):
  23.         ret = []
  24.         char = ""
  25.        
  26.         for j in range(cols):
  27.             if show[j]:
  28.                 char = random.choice(RANDCHARS)
  29.             else:
  30.                 char = " "
  31.  
  32.             if glow:
  33.                 show[j] = max(0, show[j] + random.randint(1250 / rows, 2250 / rows) )
  34.             else:
  35.                 show[j] = max(0, show[j] - random.randint(4, last[j] * (400 / rows)) )
  36.  
  37.             show[j] = max(show[j], 0)
  38.  
  39.             glow = max(glow - 1, 0)
  40.  
  41.             if show[j] < 32 and not random.randint(0, 1500 / rows):
  42.                 glow = 4
  43.  
  44.             ret.append((char, show[j]))
  45.  
  46.         yield ret
  47.  
  48.     raise StopIteration
  49.  
  50. def generateImage(width, height, font, alpha=128):
  51.     bigwidth, bigheight   = width * 2, height * 2
  52.     fontwidth, fontheight = font.getsize(" ")
  53.  
  54.     ret  = Image.new("RGBA", (bigwidth, bigheight), color=(0, 0, 0, alpha))
  55.     ret1 = Image.new("RGBA", (bigwidth, bigheight), color=(192, 255, 192, 255))
  56.     ret2 = Image.new("RGBA", (bigwidth, bigheight), color=(0,   255, 0,   255))
  57.  
  58.     mask = BLACKMASK(bigwidth, bigheight)
  59.  
  60.     canvas = ImageDraw.Draw(mask)
  61.  
  62.     for i, layer in enumerate(matrix(bigwidth / fontwidth, (bigheight / fontheight) + 2)):
  63.        
  64.         for j, (char, alpha) in enumerate(layer):
  65.             canvas.text((2 + (fontwidth * j), 2 + (fontheight * i)), char, font=font, fill=alpha)
  66.  
  67.     blurred = mask.filter(ImageFilter.BLUR)
  68.  
  69.     ret1.putalpha(mask)
  70.     ret2.putalpha(blurred)
  71.  
  72.     ret.paste(ret1, (0, 0), ret1)
  73.     ret.paste(ret2, (0, 0), ret2)
  74.  
  75.     resized = ret.resize((width, height), Image.BICUBIC)
  76.    
  77.     return resized
  78.  
  79. def norMain():
  80.     img = generateImage(200, 200, TERMINUS)
  81.     img.save("test.png")
  82.  
  83. def cgiMain():
  84.     form = {}
  85.     cgiforms = cgi.FieldStorage()
  86.     size  = 100
  87.     alpha = 128
  88.  
  89.     for val in cgiforms:
  90.         form[val.lower()] = cgiforms[val].value
  91.  
  92.     if "alpha" in form:
  93.         try:
  94.             alpha = int(form["alpha"])
  95.         except ValueError:
  96.             pass
  97.  
  98.     if "size" in form:
  99.         try:
  100.             size = int(form["size"])
  101.         except ValueError:
  102.             pass
  103.  
  104.     size = max(50, size)
  105.     size = min(size, 300)
  106.  
  107.     alpha = max(0, alpha)
  108.     alpha = min(alpha, 255)
  109.  
  110.     output = StringIO()
  111.     img = generateImage(size, size, TERMINUS, alpha)
  112.     img.save(output, "PNG")
  113.  
  114.     print("Content-type: image/png\n")
  115.     print(output.getvalue())
  116.  
  117. if __name__ == "__main__":
  118.     if "REMOTE_ADDR" in os.environ:
  119.         cgitb.enable()
  120.         cgiMain()
  121.     else:
  122.         norMain()
  123.     norMain()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement