from PIL import Image, ImageDraw
from random import *
def symbols():
sym = [None] * 10
sym[0] = (0,1,1,1,1,1,1)
sym[1] = (0,1,0,0,0,0,1)
sym[2] = (1,1,1,0,1,1,0)
sym[3] = (1,0,1,1,1,1,0)
sym[4] = (1,0,0,1,1,0,1)
sym[5] = (1,0,1,1,0,1,1)
sym[6] = (1,1,1,1,0,1,1)
sym[7] = (0,0,0,1,1,1,1)
sym[8] = (1,1,1,1,1,1,1)
sym[9] = (1,0,1,1,1,1,1)
return sym
def drawsymbol(im,sym,len,pos,step,dr,lines):
draw = ImageDraw.Draw(im)
dir = [(-1,0),(0,+1),(+1,0),(0,-1),(0,-1),(-1,0),(0,+1)]
x,y = pos
for i,l in enumerate(sym):
xf, yf = x+dir[i][0]*len, y+dir[i][1]*len
rx = [x] if abs(x-xf) == 0 else range(min(x,xf),max(x,xf),step)
ry = [y] if abs(y-yf) == 0 else range(min(y,yf),max(y,yf),step)
if l:
for cx in rx:
for cy in ry:
for n in range(lines):
dx, dy = 0,0
dsx,dsy = 0,0
while 0 in [dx,dy]:
dx, dy = randint(-dr,dr), randint(-dr,dr)
dsx, dsy = randint(-dr,dr), randint(-dr,dr)
draw.line([cx+dsx,cy+dsy,cx+dx,cy+dy],fill=0,width=1)
x,y = xf, yf
def drawnoise(im,step,dr):
draw = ImageDraw.Draw(im)
w,h = im.size
for x in range(0,w,step):
for y in range(0,h,step):
draw.line([x+randint(-dr,dr),y+randint(-dr,dr),x+randint(-dr,dr),y+randint(-dr,dr)],fill=0,width=1)
if __name__ == "__main__":
sym = symbols()
nums = [randint(0,9) for x in range(10)]
im = Image.new('L', (230,50), 220)
drawnoise(im,10,30)
for i,s in enumerate(nums):
drawsymbol(im,sym[s],12,(22*(i+1),25),1,4,2)
print 'Number',''.join(str(x) for x in nums),'generated as captcha.jpg'
im.save('captcha.jpg')