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