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()