# -*- coding: utf-8 -*- """ Created on Sun Oct 4 15:57:46 2015 @author: keithguofan """ import random from PIL import Image,ImageDraw,ImageFont import math,string class RandomChar(): @staticmethod def Unicode(): val = random.randint(0x4E00,0x9FBF) return unichr(val) @staticmethod def GB2312(): head=random.randint(0xB0,0xCF) body=random.randint(0xA,0xF) tail=random.randint(0,0xF) val = (head <<8)|(body<<4)|tail str="%x" % val # return str.decode('hex').decode('gb2312') # return str.encode('gb2312').decode('gb2312') return codecs.decode(str,'hex_codec').decode('gb2312') class ImageChar(): def __init__(self,fontColor=(0,0,0), size=(100,40), # fontPath='C:/Windows/Fonts/wqy.ttc', fontPath='C:/Windows/Fonts/simsun.ttc', bgColor=(255,255,255), fontSize=20): self.size=size self.fontPath=fontPath self.bgColor=bgColor self.fontSize=fontSize self.fontColor=fontColor self.font=ImageFont.truetype(self.fontPath,self.fontSize) self.image=Image.new('RGB',size,bgColor) def rotate(self): self.image.rotate(random.randint(0,30),expand=0) def drawText(self,pos,txt,fill): draw=ImageDraw.Draw(self.image) # print(pos) # print(txt) #print(self.font) #print(fill) draw.text(pos,txt,font=self.font,fill=fill) del draw def randRGB(self): return (random.randint(0,255), random.randint(0,255), random.randint(0,255)) def randPoint(self): (width,height)=self.size return (random.randint(0,width),random.randint(0,height)) def randLine(self,num): draw=ImageDraw.Draw(self.image) for i in range(0,num): draw.line([self.randPoint(),self.randPoint()],self.randRGB()) del draw def randChinese(self,num): gap=5 start=0 for i in range(0,num): char =RandomChar().GB2312() x=start + self.fontSize * i +random.randint(0,gap)+gap*i self.drawText((x,random.randint(-5,5)),RandomChar().GB2312(),self.randRGB()) self.rotate() self.randLine(18) def save(self,path): self.image.save(path) if __name__ == '__main__': ic=ImageChar(fontColor=(100,211,90)) ic.randChinese(4) ic.save("5.jpeg")
最近在研究验证码识别,中文的验证码不太好识别,上面的代码我参考了一些博客,亲测通过。我的python环境是python3.4
生成的图片大概是这个样子:
代码很简单。
核心思想是:
生成随机十六进制数字,然后将其转换为汉字,通过ImageDraw的方法将其打印到图片中,对字做一些随机旋转,然后随机加入随机颜色的线段。
如有不懂的可以联系我哦。