1、Pillow

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 图像内存中。

Image

文件的属性

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

Image与二进制流

以二进制流保存图片
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()

ImageFilter

图片效果

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

ImageGrab

屏幕截图

from PIL import ImageGrab 

#截取屏幕指定区域的图像,不带参数表示全屏幕截图
#参数为一个tuple,分别是:开始位置、结束位置、长、高
im = ImageGrab.grab((0,0,800,200)) 

im.show()

ImageDraw

生成验证码

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)