PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。
由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow。
文档地址:https://pillow-cn.readthedocs.io/zh_CN/latest/
pip install pillow
Image:模块提供了一个具有相同名称的类,该类用于表示 PIL 映像。该模块还提供了许多出厂函数,包括从文件加载图像和创建新映像的函数。
ImageChops:模块包含许多算术图像操作,称为通道操作("chops")。这些可用于各种目的,包括特殊效果,图像合成,算法绘画等。
ImageColor:模块包含从 CSS3 样式的颜色说明符到 RGB 元组的颜色表和转换器。
ImageDraw:模块为 Image对象提供简单的 2D 图形。可以使用此模块创建新图像、批注或修饰现有图像,以及动态生成图形以供 Web 使用。
ImageGrab:模块可用于将屏幕或剪贴板的内容复制到 PIL 图像内存中。
from PIL import Image
im = Image.open('./test.jpg')
#format属性定义了图像的格式,如果图像不是从文件打开的,那么该属性值为None
print('图片的格式为:%s' % im.format)
#size属性是一个tuple,表示图像的宽和高(单位为像素)
print('图片的,宽:%s,高:%s' % im.size)
#mode属性为表示图像的模式,常用的模式为:L为灰度图,RGB为真彩色,CMYK为pre-press图像
print('图片的模式为:%s' % im.mode)
'''
图片的格式为:JPEG
图片的,宽:995,高:995
图片的模式为:RGB
'''
from PIL import Image
im = Image.open('./test.jpg')
#获取图片的尺寸
w,h = im.size
#进行缩放,这个函数直接修改原图的大小
#也可以是用resize(),这个函数不会修改原图大小,会返回
im.thumbnail((w / 2,h / 2))
#保存使用jpeg的格式保存图片
im.save('./ahalf.jpg','jpeg')
from PIL import Image
from io import BytesIO
im = Image.open('./test.jpg')
b = BytesIO()
#保存为二进制流
im.save(b,'jpeg')
#将二进制流中的数据,写入一个jpg文件
with open('./new.jpg','wb') as f:
f.write(b.getvalue())
b.close()
from PIL import Image
from io import BytesIO
f = open('./test.jpg','rb')
b = BytesIO(f.read())
im = Image.open(b)
#使用系统默认图片浏览器打开图片
im.show()
from PIL import Image,ImageFilter
im = Image.open('./test.jpg')
# 高斯模糊
im.filter(ImageFilter.GaussianBlur)
# 普通模糊
im.filter(ImageFilter.BLUR)
# 边缘增强
im.filter(ImageFilter.EDGE_ENHANCE)
# 找到边缘
im.filter(ImageFilter.FIND_EDGES)
# 浮雕
im.filter(ImageFilter.EMBOSS)
# 轮廓
im.filter(ImageFilter.CONTOUR)
# 锐化
im.filter(ImageFilter.SHARPEN)
# 平滑
im.filter(ImageFilter.SMOOTH)
# 细节
im.filter(ImageFilter.DETAIL)
im.show()
from PIL import ImageGrab
#截取屏幕指定区域的图像,不带参数表示全屏幕截图
#参数为一个tuple,分别是:开始位置、结束位置、长、高
im = ImageGrab.grab((0,0,800,200))
im.show()
from PIL import Image,ImageDraw,ImageFilter,ImageFont
import random
import string
from io import BytesIO
#随机字母或数字
def ranChar():
charList = string.ascii_letters + string.digits
return random.choice(charList)
#生成随机rgb颜色1
def ranColor1():
return (random.randint(64,255),random.randint(64,255),random.randint(64,255))
#生成随机rgb颜色2
def ranColor2():
return (random.randint(32,127),random.randint(32,127),random.randint(32,127))
#生成验证码图片字节流和验证码字符串
def getVerImage(size):
"根据宽高tuple,生成验证码图片字节流和验证码字符串"
verStr = ''
#生成一个自定义图片,模式RGB,图片底色255.255.255
im = Image.new('RGB',size,(255,255,255))
#生成画笔对象
draw = ImageDraw.Draw(im)
#给图片上放干扰点
for x in range(size[0]):
for y in range(size[1]):
draw.point(xy=(x,y),fill=ranColor1())
# 创建Font对象,字体文件可以到网上下一个,或者到c:/windows/Fonts文件夹找一个
font = ImageFont.truetype(font='./ARLRDBD.TTF',size=36)
# 输出文字:
for t in range(4):
ranc = ranChar()
verStr += ranc
draw.text((60 * t + 10, 10), ranc,font=font, fill=ranColor2())
#添加模糊效果
im.filter(ImageFilter.BLUR)
with BytesIO() as bt:
im.save(bt,'jpeg')
return bt.getvalue(),verStr
#测试
bts,verStr = getVerImage((240,60))
print(verStr)
with open('./ver.jpg','wb') as f:
f.write(bts)