zoukankan      html  css  js  c++  java
  • 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')

    三、生成一个带字符划线的图片

    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())
  • 相关阅读:
    41:和为S的两个数
    40:数组中只出现一次的数字
    39-2:平衡二叉树
    39:二叉树的深度
    38:数字在排序数组中出现的次数
    37:两个链表的第一个公共结点
    36:数组中的逆序对
    35:第一个只出现一次的字符
    34:丑数
    33:把数组排成最小的数
  • 原文地址:https://www.cnblogs.com/shangwei/p/14336045.html
Copyright © 2011-2022 走看看