pip install pillow
一般导入 PIL.Image
from PIL import Image 导入模块
不能使用 from PIL import *
im=Image.open('图片文件路径') 开启文件 返回 图片对象
im.show() 显示图片 使用系统默认程序打开图片
im.save('导出文件名称')
format 默认为 导入文件名称中的后缀名
可以手动设置 按照指定格式保存
quality 用来设置保存图片的质量
95 最佳
1 最差
75 默认
im.format 这个变量保存了 im对象 保存的图片的格式 字符串类型
im.mode 这个变量保存了 im对象 保存的图片的像素格式 字符串类型
1 1位像素 黑白
L 8位像素 黑白
P 8位像素 可以使用调色板映射到其他模式
RGB 3*8位像素 真彩
RGBA 4*8位像素 真彩+透明通道
CMYK 4*8位像素 颜色隔离
YCbCr 3*8位像素 彩色视频格式
I 32位整型像素
F 32位浮点型像素
im.size 这个变量保存了 im对象 保存的图片的大小信息 元组类型
im.convert(像素格式) 返回新的图片对象
当像素格式为'P'时
Dither 控制颜色抖动 默认为 FLOYDSTEINBERG
不启用设置为 NONE
Palette 控制调色板的产生 默认为 WEB 216色的web palette
优化调色板需设置为 ADAPTIVE
Colors 当Palette 为 ADAPTIVE 时控制颜色数量 默认为 256 最大值
当RGB RGBA 转换为 L 或 L转换为 RGB RGBA 时
可以使用元组 a=(0.1,0.2,0.3,0.4)
im.convert('L',a)
默认的转换算法为 L = R * 299/1000 + G * 587/1000+ B * 114/1000
使用这种方式之后 L= R*a[0]+G*a[1]+B*a[2]
RGBA是 L=R*a[0]+G*a[1]+B*a[2]+A*a[3]
im.info 保存了图片的 相关信息 为字典类型
Image.new(像素格式,大小)
大小为元组类型
第三个参数为可选参数 意义为 生成图片的颜色
默认为 0 为黑色
可以使用 #颜色标号 来表示颜色
也可以使用 模块定义过意义的 颜色字符串 来表示
im.copy() 复制当前对象 然后返回对象
im.crop() 裁剪图片
参数为 元组类型 (x,y,x1,y1) 表示坐标
原点为原图片的左上角
im.paste(im1,坐标)
将im1保存的图片 粘贴在 im对象所保存的图片上
im1 保存的图片的左上角为 坐标的左上角
坐标为(x,y) 或 (x,y,x1,y1)
如果坐标为 (x,y,x1,y1) 格式那么需要手动计算 需要粘贴的图片大小
需要保证
x1-x =im1保存的图片的宽
y1-y =im1保存的图片的高
im.paste(im1,坐标,im2)
将im1和im2 做透明重叠之后粘贴到im图片的指定坐标的位置上
im.filter(过滤器)
需要导入 from PIL import ImageFilter
返回过滤后的图片对象
过滤器有
ImageFilter.BLUR 均值过滤 会将图片变的模糊
ImageFilter.CONTOUR 找轮廓 将原图片的轮廓信息提取出来
ImageFilter.DETAIL 使细节变得更加明显
ImageFilter.EDGE_ENHANCE 提高人眼对目标图片的识别能力
ImageFilter.EDGE_ENHANCE_MORE 使图片中间部分的边缘更加明显
ImageFilter.EMBOSS 使图像呈现出浮雕效果
ImageFilter.FIND_EDGES 边缘检测 找出图片的边缘信息
ImageFilter.SMOOTH 使图片平缓渐变 减少突变梯度 改善图片质量
ImageFilter.SMOOTH_MORE 使图片更加平滑
ImageFilter.SHARPEN 使图片变得清晰
Image.blend(im1,im2,n)
设置两张图片的透明度 将两张图片合成一张图片
n为透明度
将im1的透明度设置为 im1*(1.0-n) (1.0-n)表示im1的透明程度
im2的透明度设置为 im1*n n表示im2 的透明度
然后将两张图片叠加在一起
两张图片的大小需要相同
im.split()
返回三个图片对象 分别代表图像的三个通道 R G B
相当于原先 3*8位 为一个像素
使用split() 之后
将每一个像素分为 8位一个像素 比如 R 只包括 代表R通道的那8位
Image.composite(im1,im2,m)
使用m图片作为 透明度
对im1 im2 做透明处理 然后叠加在一张图片 返回
所有图片的大小必须相同
Image.eval(im1,fun)
fun 是一个函数 有一个参数
将im1 保存的图片的每个像素的每个通道 作为参数传入fun函数 进行处理
返回一张处理好的图片
Image.merge(mode,[im])
将多个单通道的图片按照一定的像素格式合成一张图片
mode 表示合成图像的像素格式
mode表示的像素格式 的通道个数 就是 图像列表需要拥有的成员的个数
im.draft(mode,size)
将im的像素格式设置为mode
大小设置为 size size为元组格式
返回修改后的图片对象
im.getbands()
将im所保存的对象 每个通道的名称 作为元组保存
im.getbbox()
返回 (x,y,x1,y1)
x,y 左上
x,y1 左下
x1,y 右上
x1,y1 右下
im.getdata()
返回 Sequence 可以使用list转换为列表
这个 列表中的成员是图片的所有像素
成员为元组类型 元组中储存的 是图片的每个像素的R G B 三个值
返回的列表的成员顺序和 像素的关系是 一行一行对应 类似c语言中的二维数组
im.getextrema()
返回值 元组类型 每个成员表示 RGB 三个通道
每个成员为元组类型 储存分别储存 RGB 三个通道的最大值和最小值
im.getpixel((x,y))
返回im保存的图片 的指定位置像素的信息
比如如果像素格式为 RGB 那么 返回值就为 储存指定位置的RGB 三个通道的值的元组
如果要批量获取像素信息 使用 getdata 比较好
im.load()
返回一个用于读取和修改像素的对象
a=im.load()
可以使用a这个对象 读取im保存的图片的每个像素的信息
也可以通过a这个对象 修改im保存的图片的每个像素的信息
不过不会直接应用到对应的文件上
需要im保存才能应用到对应的文件上
a[0,1] 获取im保存的图片 的左上角向右的第一个像素 的信息
a[0,1]=(r,g,b) 这里假设im保存的图片的像素格式为 rgb
那么要赋值时使用的元组的成员个数就需要对应 R G B 三个通道
im.putdata(data,s,o)
从im保存的图片的左上角开始
保存的顺序为:
a=im.load()
for i in range(n):
for j in range(n2):
a[j,i]=data[j+n2*i]*s+o
这里以图片的像素格式为 L 为例子
data的成员的类型在和像素格式有关
如果图片有多个通道 那么 data的成员就为元组类型 元组中的成员就对应通道
im.Resize((w,h))
将im对应的图片 的宽设置为 w 高设置为 h
并对图片进行 相应的 拉伸和压缩
返回修改后的图片
im.Rotate(n,fil,exp)
将im对应的图片 顺时针旋转n度
fil默认为 NEAREST
可使用 NEAREST BILINEAR BICUBIC ANTIALIAS 默认为 NEAREST
用来表示旋转后图片的质量
exp 默认为 false 表示输出图像与原图大小相同 多出的部分被忽略
如果为true 那么将自动缩小旋转后的图像 使旋转不使图片缺少 旋转之后整个图片和原图大小相同
im.seek(n)
当im为 gif图片文件对象时使用
导入图片之后直接输出 会 显示第0帧
im.seek(1) 会将im当前输出的图片变为原图的 第1帧
不影响后面获取原图某一帧
im.tell()
im为gif图片文件对象
返回当前图片位于原图的第n帧 从0 计算
im.thumbnail(n,f)
f 为 NEAREST BILINEAR BICUBIC ANTIALIAS 默认为 NEAREST
其中质量最好的为 ANTIALIAS
将图片按照比例缩放到符合n的大小 不会大于n
n的值应为 (w,h)
im.transform(s,me,data,fil)
s的格式为(w,h)
在im所保存的图片中截取data所表示的范围中的图像
将截取的图像按照比例放大或缩小 到s所表示的大小
me可取的值 为 EXTENT 截取一个矩形区域
当me 的值为 Image.EXTENT 时
data为一个 有四个成员的元组用来代表 矩形的左上角 和右下角
(x,y,x1,y1)
AFFINE 放射变换
当me的值为 Image.AFFINE 时
data为一个有六个成员的元组
将新生成的每一个像素的位置设置为 (x,y)
将data设置为 (a,b,c,d,e,f)
新生成的图片叫 im1
那么 im1 的每一个像素 就是
原图片的 (a*x+b*y+c,d*x+e*y+f)所指向的位置处的像素
新图片的(1,1) 位置的像素就是
原图片的 (a+b+c,d+e+f) 位置的像素
QUAD 将四边型转换为矩形
当me的值为 Image.QUAD 时
data为一个有八个成员的元组(x,y,x1,y1,x2,y2,x3,y3)
每一对(xn,yn) 都表示四边形的一个角的坐标
在截取由data表示的四边形后
再将这样一个图形强行变成s(w,h) 所表示的矩形
MESH 映射多个正方形
PERSPECTIVE 对图像进行透视变换
类似AFFINE
当me的值为 Image.PERSPECTIVE 时
data为一个有八个成员的元组(a,b,c,d,e,f,g,h)
将新生成的图像的每一个像素的位置设置为(x,y)
新生成的图像的名称为 im1
那么im1的每一个像素 就是 原图像的
((a*x+b*x+c)/(g*x+h*y+1),(d*x+e*y+f)/(g*x+h*y+1))
位置的像素 一一对应
im.transpose(m)
旋转或翻转当前图像
m可取值 FLIP_LEFT_FIGHT 将原图左右翻转后的结果返回
FLIP_TOP_BOTTOM 将原图上下反转后的结果返回
ROTATE_90 将原图顺时针旋转90度后的结果返回
ROTATE_180 将原图顺时针旋转180度后的结果返回
ROTATE_270 将原图顺时针旋转270度之后的结果返回