Image
模块:操作图像类new()
:创建一个新的图片可实现:创建一个新的图片
实例:创建一个模式:RGB
,大小:400*400,颜色:白色的图片
from PIL import Image
# 创建一个模式:RGB,大小:400*400,颜色:白色的图片
im = Image.new(mode="RGB",size=(400,400),color=(255,255,255))
# 展示图片
im.show()
注意:
如果想要修改代码中的图片大小,那么字体大小、字母位置的y
坐标,都需要重新设置
save()
:保存图片可实现:将图片保存在本地
实例:将上面创建的图片保存图片至默认地址:项目地址,格式:JPEG
from PIL import Image
# 创建一个模式:RGB,大小:400*400,颜色:白色的图片
im = Image.new(mode="RGB",size=(400,400),color=(255,255,255))
# 保存图片至默认地址:项目地址,格式:JPEG
im.save("pic.jpg",format="JPEG")
putpixel()
:设置像素点颜色(1)可实现:对单个像素点的颜色变化
实例:设置照片的像素点颜色为:黑色
from PIL import Image
# 创建一个模式:RGB,大小:400*400,颜色:白色的图片
im = Image.new(mode="RGB",size=(400,400),color=(255,255,255))
# 获取图片大小,x代表长,y代表宽
x,y = im.size
# 将图片所有的像素点都设置为黑色
for i in range(x):
for j in range(y):
# (i,j)代表像素点位置
# (0,0,0)代表黑色
im.putpixel((i,j),(0,0,0))
im.show() # 展示图片
(2)添加random
模块,可实现像素点的多样性,形成像素点随机变换
进而,可实现:图片背景的随机性
from PIL import Image
from random
# 创建一个模式:RGB,大小:400*400,颜色:白色的图片
im = Image.new(mode="RGB",size=(400,400),color=(255,255,255))
# 获取图片大小,x代表长,y代表宽
x,y = im.size
# 随机生成图片所有像素点的颜色
for i in range(x):
for j in range(y):
# (i,j)代表像素点位置
# random.randint(0,255) 代表随机生成颜色
im.putpixel((i,j),(random.randint(0,255),(random.randint(0,255),random.randint(0,255)))
im.show() # 展示图片
ImageDraw
模块:在图像上作业text()
:写入文本可实现:在图像中写入英文字母
实例:
from PIL import Image,ImageDraw
# 创建一个模式:RGB,大小:400*400,颜色:白色的图片
im = Image.new(mode="RGB",size=(100,50),color=(255,255,255))
# 创建图像绘制对象:PIL.ImageDraw.ImageDraw object
draw = ImageDraw.Draw(im,mode="RGB")
# 使用text方法:将文本:'abcdef',颜色:红色,放置在图像(0,20)位置,
draw.text((0,20),text = 'abcdef',fill="red")
im.show()
ImageFont
模块:设置字体(truetype()
)可实现:字体的多样性
实例:
from PIL import Image,ImageDraw,ImageFont
# 创建一个模式:RGB,大小:400*400,颜色:白色的图片
im = Image.new(mode="RGB",size=(100,50),color=(255,255,255))
draw = ImageDraw.Draw(im,mode="RGB")
# 设置字体格式及字体大小
font1 = ImageFont.truetype("DejaVuSerif-Bold-webfont.ttf",size=20)
draw.text((0,20),text = 'abcdef',fill="red",font=font1)
im.show()
random
模块:随机数生成可实现验证码英文字母的多样性
4.1 random.randint()
:获取整型随机数
可实现:随机在A-Z中选取一个大写英文字母
实例:
import random
# 随机在A-Z中选取一个大写英文字母
print(chr(random.randint(65,90)))
4.2random.choice()
:获取随机获取列表中的随机数
可实现:验证码英文大小字母的多样性
import random
# 随机在大写字母和小写字母之间选择一个字母
print(random.choice([chr(random.randint(65,90)),chr(random.randint(97,122))]))
chr(random.randint(65,90))
:随机选取一个大写字母
chr(random.randint(97,122))
:随机选取一个小写字母
random.choice([chr(random.randint(65,90)),chr(random.randint(97,122))])
:
在随机选取的大写字母和随机选取的小写字母之间选取一个字母
可在本机文件中搜索ttf
,或者在网上下载一个字体文件,在本实例中,使用的是DejaVuSerif-Bold-webfont.ttf
注意:
如果字体文件存放在其他目录,在添加字体时,需要输入字体文件的绝对地址。
65-90==A-Z
97-122 对应 a-z
Traceback (most recent call last):
File "E:/PycharmProjects/Compress_images/comperss.py", line 14, in <module>
font1 = ImageFont.truetype('KaTeX_Typewriter-Reglar.ttf',30)
File "D:\pythonsoft\python3.7\lib\site-packages\PIL\ImageFont.py", line 275, in truetype
return FreeTypeFont(font, size, index, encoding, layout_engine)
File "D:\pythonsoft\python3.7\lib\site-packages\PIL\ImageFont.py", line 144, in __init__
self.font = core.getfont(font, size, index, encoding, layout_engine=layout_engine)
OSError: cannot open resource
解决办法:
将第14行代码的字体文件更换成你自己的字体文件
from PIL import Image,ImageDraw,ImageFont
import random
# 创建一个空白图片,模式为RGB,大小为200*50
im = Image.new('RGB',(200,50),color =(255,255,255))
# 创建画笔
draw = ImageDraw.Draw(im,mode="RGB")
x,y = im.size
# 生成随机背景
for i in range(x):
for j in range(y):
# 设置像素点的颜色
im.putpixel([i, j], (random.randint(0,255),random.randint(0,255),random.randint(0,255)))
# 设置字体
font1 = ImageFont.truetype('DejaVuSerif-Bold-webfont.ttf',30)
# 写入文本
count = 0 # 写入图片的位置
# 生成5个字母
for i in range(5):
# 生成随机大小写字母文本
char1 = random.choice([chr(random.randint(65,90)),chr(random.randint(97,122))])
# 写入文本,位置均匀分布在图像上,颜色随机(0,255),字体为font1,
draw.text((count, 10), char1, fill=random.randint(0,255), font=font1)
count += x//5 # 写入五个字母,均匀分布字母至图片
# 画两条阻碍字母的随机横线,随机颜色 ,宽度为3
# 随机横线取值:random.randint(y-30,y-10):字体=20,y=50 :y-30:为与字体的最上方,y-10为与字体的最下方
draw.line((0,random.randint(y-30,y-10),x,random.randint(y-30,y-10)),fill=random.randint(50,200),width=3)
draw.line((0,random.randint(y-30,y-10),x,random.randint(y-30,y-10)),fill=random.randint(100,255),width=3)
# 展示图片
im.show()
输出图片样式:
随机像素点背景+随机大小写字母+随机字母颜色+随机模糊横线*2