Python PIL 生成验证码
问题
在安装PIL的时候会发生一些问题
PIL是Python平台事实上的图像处理标准库,支持多种格式,并提供强大的图形与图像处理功能。目前PIL的官方最新版本为1.1.7,支持的版本为python 2.5, 2.6, 2.7,并不支持python3,因此我们用pillow代替,进入DOS命令行窗口,敲入以下代码
pip install pillow
一、生成一张图片
from PIL import Image # 获取一个Image对象,参数分别是RGB模式。宽150,高30,红色 image = Image.new('RGB',(150,30),'red') # 保存名为test.png格式为png的图片 image.save(open('./test.png','wb'),'png')
二、生成一个带字符的图片
import random from PIL import Image, ImageDraw, ImageFont def getRandomColor(): '''获取一个随机颜色(r,g,b)格式的''' c1 = random.randint(0, 255) c2 = random.randint(0, 255) c3 = random.randint(0, 255) return (c1, c2, c3) # 获取一个Image对象,参数分别是RGB模式。宽150,高30,随机颜色 image = Image.new('RGB', (150, 30), getRandomColor()) # 获取一个画笔对象,将图片对象传过去 draw = ImageDraw.Draw(image) # 获取一个font字体对象参数是ttf的字体文件的目录,以及字体的大小 font = ImageFont.truetype("kumo.ttf", size=32) # 在图片上写东西,参数是:定位,字符串,颜色,字体 draw.text((20, 0), '../scripts/LucidaSansDemiOblique.ttf', getRandomColor(), font=font) # 保存到硬盘,名为test.png格式为png的图片 image.save(open('test.png', 'wb'), 'png')
注:kumo.ttf是在 C:\Windows\Fonts下,如没权限可更换目录
三、生成一个带字符划线的图片
from cStringIO import StringIO from random import randrange, sample, choice from PIL import Image, ImageFont, ImageDraw img_width = 58 img_height = 30 font_size = 16 font_color = ['black', 'darkblue', 'darkred'] codes = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" background = (randrange(230, 255), randrange(230, 255), randrange(230, 255)) line_color = (randrange(0, 255), randrange(0, 255), randrange(0, 255)) # 存放文字样式的文件 sample_file = os.path.join(os.path.dirname(__file__), '../scripts/LucidaSansDemiOblique.ttf') # 文字样式 和 文字大小 font = ImageFont.truetype(sample_file, font_size) # 获取一个Img对象,参数分别是RGB模式。58,高30,颜色 img = Image.new('RGB', (img_width, img_height), background) # 生成验证码文字 code = ''.join(sample(codes, 4)) # 获取一个画笔对象,将图片对象传过去 draw = ImageDraw.Draw(img) # 画上随机线路 for i in range(randrange(3, 5)): xy = (randrange(0, img_width), randrange(0, img_height), randrange(0, img_width), randrange(0, img_height)) draw.line(xy, fill=line_color, width=1) x = 2 # 写入 4 个字符 for i in code: y = randrange(0, 10) # draw.text((x, y), i, font=font, fill=choice(font_color)) draw.text((x, y), i, fill=choice(font_color)) x += 14 buf = StringIO() # save 可以写成图片路径与名称 后面跟的是格式 img.save(buf, 'gif') buf.seek(0) # with open 存储方式 with open('test.gif','wb') as f: f.write(buf.read())
注:
一、Python3没有cStringIO,在Pyhton3中可使用 BytesIO 代替 StringIO
from io import BytesIO