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

 

posted @ 2021-01-27 17:31  你的小可爱吖  阅读(174)  评论(0编辑  收藏  举报