PIL实现图片框架以及生成图片验证码

1. PIL的基本概念

PIL:即Python Imaging Library,是Python平台事实上的图像处理标准库。

PIL中涉及通道(bands)和模式(mode)这两个重要概念。

(1)通道

每张图片都是由一个或者多个数据通道构成。PIL允许在单张图片中合成相同纬度和深度的多个通道。

以RGB图像为例,每张图片都是由三个数据通道构成,分别是R、G、B通道,而对于灰度图像,则只有一个通道。

(2)模式

图像的模式定义了图像的类型和像素的位宽。当前支持如下模式:

1: 1位像素,表示黑和白,但是存储的时候每个像素存储为8bit

L: 8位像素,表示黑和白

P: 8位像素,使用调色板映射到其他模式。

RGB: 3*8位像素,为真彩色。

RGBA: 4*8位像素,有透明通道的真彩色。

CMYK: 4*8位像素,颜色分离。

YCbCr: 3*8位像素,彩色视频格式。

I: 32位整型像素

F: 32位浮点型像素

PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)

 

2. 图片框架实现

 1 from PIL import Image, ImageFilter
 2 
 3 img = Image.open('微微一笑很倾城.jpg')
 4 
 5 width, height = img.size
 6 print(width, height)
 7 # img = img.thumbnail(width//10, height//10)
 8 
 9 # 旋转
10 # img = img.rotate(45)
11 
12 # 通道数
13 bands = img.getbands()
14 print(bands)
15 
16 # 灰度化
17 # img = img.convert('L')
18 # print(img.getbands())
19 
20 # 获取像素值
21 pixes = img.getpixel((200, 200))
22 print(pixes)
23 
24 # 滤波器,滤镜
25 # img = img.filter(ImageFilter.EMBOSS) # 浮雕
26 # img = img.filter(ImageFilter.BLUR) # 模糊,生成噪点
27 # img = img.filter(ImageFilter.CONTOUR) # 素描
28 # img = img.filter(ImageFilter.DETAIL) # 锐度
29 
30 # 返回像素直方图
31 # 作用:表示像素值的分布情况
32 pr = img.histogram()
33 print(pr)
34 
35 # 图片加水印,两张图片合成
36 img1 = Image.open('img.png')
37 img.paste(img1, (200, 100))
38 
39 img.show()
40 # jpeg是jpg的全称
41 img.save('test.jpg','jpeg')

 

3. 生成图片验证码

 1 from PIL import Image, ImageDraw, ImageFont
 2 import random
 3 
 4 # 随机字母
 5 def rand_char():
 6     return chr(random.randint(65, 97))
 7 
 8 
 9 # 随机颜色, 前景色
10 def rand_color1():
11     return (random.randint(64, 255),
12             random.randint(64, 255),
13             random.randint(64, 255))
14 
15 
16 # 背景色
17 def rand_color2():
18     return (random.randint(32, 127),
19             random.randint(32, 127),
20             random.randint(32, 127),)
21 
22 
23 # 240*60
24 width = 240
25 height = 60
26 # 画板
27 image = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
28 
29 # 创建字体对象
30 font = ImageFont.truetype(font='arial.ttf', size=36)
31 # 创建画笔Draw对象
32 draw = ImageDraw.Draw(image)
33 # 填充像素
34 for x in range(width):
35     for y in range(height):
36         draw.point((x, y), fill=rand_color1())
37 
38 # 写入文字
39 for i in range(4):
40     draw.text((60*i+10, 10), text=rand_char(), font=font, fill=rand_color2())
41 
42 image.show()

 

posted @ 2019-05-31 19:44  cymx66688  阅读(422)  评论(0编辑  收藏  举报