PIL包的应用

PIL 是Python Imaging Library的简称,PIL是一个Python处理图片的库,提供过了一系列模块和方法。
比如:裁切,平移,旋转,改变尺寸等。
PIL有如下几个模块:Image模块、ImageChops模块、ImageCrackCode模块、ImageDraw模块、ImageEnhance模块、
ImageFile模块、
ImageFileIO等等

最基本的导出图片

from PIL import Image
# 把图片输出并存为对象引用
image = Image.open('shibie.png')

以下就是一些应用


from PIL import Image,ImageDraw
# 把图片输出并存为对象引用
image = Image.open('shibie.png')

# 改变图片大小
new_img = image.resize((256,256),Image.BILINEAR)
# 保存图片
new_img.save('2.jpeg')

# 旋转图片
new_img1 = image.rotate(45)
# 保存图片
new_img1.save('3.jpeg')

# 直线绘制
# PIL的ImageDraw模块提供了图形绘制的基本功能
# 可以绘制直线,弧线,椭圆,矩形等等

image_hz = Image.open("2.jpeg")
draw = ImageDraw.Draw(image_hz) # 传入参数到模块ImageDraw中的Draw函数中
width,height = image.size
# 下面2句差不多
draw.line(((0,0),(width-1,height-1)),fill = 255)
draw.line(((0,height-1),(width -1 ,0)),fill = 255)
image_hz.save("2.jpeg")

# 绘制圆
image_hzy = Image.open("shibie.png")
draw = ImageDraw.Draw(image_hzy)
width,height = image.size
draw.arc((0,0,width-1,height-1),0,360,fill=255)
image_hzy.save("4.jpeg")

制作中文验证码实例(效果的话只能生成字母数字加干扰)==>代码待研究

# 中文验证码实例(随机生成汉字,并加入一些干扰线条)
from PIL import Image,ImageDraw,ImageFont,ImageFilter
import random
# import math

_letter_cases = 'abcdefghjkmnpqrstuvwxy' # 小写字母,去除可能干扰的i,l,o,z
_upper_cases = _letter_cases.upper() # 转化为大写字母
_numbers  = "".join(map(str,range(3,10))) # 数字
init_chars = ''.join((_letter_cases,_upper_cases,_numbers))
fontType = r"‪C:\\Windows\\Fonts\\FREESCPT.TTF"

def create_validate_code(size=(120,30),
                        chars = init_chars,
                        img_type = 'PNG',
                        mode = "RGB",
                        bg_color = (255,255,255),
                        fg_color = (0,0,255),
                        font_size = 18,
                        font_type = fontType,
                        length  = 4,
                        draw_lines = True,
                        n_line = (1,2),
                        draw_points = True,
                        point_chance = 2):
                    """
                    size:图片的大小,格式(宽,高),默认为(120,30)
                    chars:允许的字符集合,始字符串
                    img_type:图片保存的格式,默认GIF
                    mode:图片模式,默认RGB
                    bg_color:背景颜色:默认白色
                    fg_color:前景色:验证码字符颜色,默认为蓝色#0000ff
                    font_size:验证码字体大小
                    font_type:验证码字体
                    length:验证码字符个数
                    draw_lines:是否划干扰线
                    n_lines:干扰线的条数范围,格式元组,默认为(1,2),只有draw_lines为True时有效
                    drwa_points:是否画干扰线
                    point_chance:干扰点出现的概率,大小范围[0,100]
                    return:[0]:PIL Image实例
                    return:[1]:验证码图片中的字符串
                    
                    """
                    width,height = size # 宽, 高
                    img = Image.new(mode,size,bg_color) # 创建图像
                    draw = ImageDraw.Draw(img) # 创建画笔
                    if draw_lines:
                        create_lines(draw,n_line,width,height)
                    if draw_points:
                        create_points(draw,point_chance,width,height)
                    strs = create_strs(draw,chars,length,font_type,font_size,width,height,fg_color)

                    # 图像扭曲参数
                    params = [1 - float(random.randint(1,2))/100,
                              0,
                              0,
                              0, # 之前少了个0 # ValueError: wrong number of matrix entries
                              1 - float(random.randint(1,10))/100,
                              float(random.randint(1,2)/500),
                              0.001,
                              float(random.randint(1,2))/500      
                               ]
                    img = img.transform(size,Image.PERSPECTIVE,params) #c
                    img = img.filter(ImageFilter.EDGE_ENHANCE) # 滤镜,边界加强(阈值更大)
                    return img,strs


def create_lines(draw,n_line,width,height):
  '''绘制干扰线'''
  line_num= random.randint(n_line[0],n_line[1])# 干扰线条数
  for i in range(line_num):
    # 起始点
    begin= (random.randint(0, width), random.randint(0, height))
    #结束点
    end= (random.randint(0, width), random.randint(0, height))
    draw.line([begin, end], fill=(0,0,0))

def create_points(draw,point_chance,width,height):
    """绘制干扰点"""
    chance  = min(100,max(0,int(point_chance))) # 大小限制在[0,100]
    for w in range(width):
        for h in range(height):
            tmp = random.randint(0,100)
            if tmp > 100 - chance:
                draw.point((w,h),fill=(0,0,0))
def create_strs(draw,chars,length,font_type,font_size,width,height,fg_color):
    """
    绘制验证码字符
    生成给定长度的字符串,返回列表格式
    """           
    c_chars= random.sample(chars,length)
    strs= ' %s ' % ' '.join(c_chars)# 每个字符前后以空格隔开
    
    font = ImageFont.truetype(font_type,font_size)
    font_width , font_height = font.getsize(strs)

    draw.text(((width-font_width)/3,(height-font_height)/3),strs,font=font,fill = fg_color)

    return ''.join(c_chars)

if __name__ == "__main__":
    code_img = create_validate_code()
    code_img[0].save("1.png","PNG") # 难道是双引号的问题
    print(code_img[1])
                    
                                    

初级教程可看pillow具体的初级教程

posted @ 2021-08-10 16:24  索匣  阅读(301)  评论(0编辑  收藏  举报