声明是从别的代码修改过来,如果你觉得眼熟,没错!就是你的代码!!
python需要一个PIL库用来画图
一个类简单生产图片对象,保存到一个缓存目录下面(这里是考虑缓存验证提高支持能力,(其实是不会直接生成到web))。
class captcha:
#图片宽度
width = 100
#图片高度
height = 40
#背景颜色
bgcolor = (255,255,255)
#加载字体
fontpath = '/tmp/FreeSans.ttf'
#字体颜色
fontcolor = (0,0,0)
#保存地址
imagepath = '/tmp/code.jpeg'
def __init__(self):
pass
def output(self):
#获取随即字符
code = '1234'
#生成背景图片
image = Image.new('RGB',(self.width,self.height),self.bgcolor)
#加载字体
font = ImageFont.truetype(self.fontpath,30)
draw = ImageDraw.Draw(image)
#画字体,(0,0)是起始位置
draw.text((0,0),code,font=font,fill=self.fontcolor)
#释放draw
del draw
#保存原始版本
image.save(self.imagepath)
#新图片
newImage = Image.new('RGB',(self.width,self.height),self.bgcolor)
#load像素
newPix = newImage.load()
pix = image.load()
offset = 0
for y in range(0,self.height):
offset += 1
for x in range(0,self.width):
#新的x坐标点
newx = x + offset
#你可以试试如下的效果
#newx = x + math.sin(float(y)/10)*10
if newx < self.width:
#把源像素通过偏移到新的像素点
newPix[newx,y] = pix[x,y]
#保存扭曲后的版本
newImage.save(self.imagepath)
newImage = image.transform((self.width+30,self.height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0))
newImage.save(self.imagepath)
#创建draw,画线用
draw = ImageDraw.Draw(newImage)
#线的颜色
linecolor= (0,0,0)
for i in range(0,15):
#都是随机的
x1 = random.randint(0,self.width)
x2 = random.randint(0,self.width)
y1 = random.randint(0,self.height)
y2 = random.randint(0,self.height)
draw.line([(x1, y1), (x2, y2)], linecolor)
#保存到本地
newImage.save(self.imagepath)
使用方法:
captcha().output()
输出在web:
image_data = open('/tmp/1234_4.jpeg', "rb").read()
return HttpResponse(image_data, mimetype="image/jpeg") #这是django的输出方式