Python Pillow(PIL)库的用法详解


Posted in Python onSeptember 19, 2020

Pillow库是一个Python的第三方库。

在Python2中,PIL(Python Imaging Library)是一个非常好用的图像处理库,但PIL不支持Python3,所以有人(Alex Clark和Contributors)提供了Pillow,可以在Python3中使用。

官方文档路径:https://pillow.readthedocs.io/en/latest/

一、安装Pillow

pip install pillow

Pillow库安装成功后,导包时要用PIL来导入,而不能用pillow或Pillow。

import PIL
from PIL import Image

在Pillow库中,有二十多个模块,还支持非常多的插件。其中最常用的是Image模块中同名的Image类,其他很多模块都是在Image模块的基础上对图像做进一步的特殊处理。本文主要介绍Image模块的常用用法,其他的模块可以按需看文档。

二、打开本地图片

# coding=utf-8
from PIL import Image
 
image = Image.open("yazi.jpg")
image.show()

运行结果:

Python Pillow(PIL)库的用法详解

open(fp, mode='r'): 打开一张图片,如果图片与当前代码在同一目录下,可以只写图片的文件名,其他情况需要拼接图片的路径。mode默认为'r',也必须为'r'。

show(): 调用图片显示软件打开图片。打开后程序会阻塞,需要手动关闭。

三、创建一张新图片

from PIL import Image
 
image = Image.new('RGB', (160, 90), (0, 0, 255))
image.show()

运行结果:

Python Pillow(PIL)库的用法详解

new(mode, size, color=0): 创建一张图片(画布),用于绘图,有3个参数。

mode, 图片的模式,如“RGB”(red,green,blue三原色的缩写,表示真彩色图像)、“L”(灰度,黑白图像)等。

size, 图片的大小。是一个长度为2的元组(width, height),表示的是像素大小。

color, 图片的颜色,默认值为0表示黑色。可以传入长度为3的元组表示颜色,也可以传入颜色的十六进制,在版本1.1.4后,还可以直接传入颜色的英文单词,如上面代码中的(0, 0, 255)可以换成‘#0000FF'或‘blue',都是表示蓝色。

四、Image模块的常用属性

from PIL import Image
 
image = Image.open("yazi.jpg")
print('width: ', image.width)
print('height: ', image.height)
print('size: ', image.size)
print('mode: ', image.mode)
print('format: ', image.format)
print('category: ', image.category)
print('readonly: ', image.readonly)
print('info: ', image.info)

运行结果:

width:  1557

height:  911

size:  (1557, 911)

mode:  RGBA

format:  jpg

category:  0

readonly:  1

width属性表示图片的像素宽度,height属性表示图片的像素高度,width和height组成了size属性,size是一个元组。

mode属性表示图片的模式,如RGBA,RGB,P,L等。

format属性表示图片的格式,格式一般与图片的后缀扩展名相关。category属性表示图片的的类别。

readonly属性表述图片是否为只读,值为1或0,表示的是布尔值。

info属性表示图片的信息,是一个字典。

五、图片的模式和模式转换

1. 图片的模式

图片有很多模式,支持以下标准模式,参考:https://pillow.readthedocs.io/en/latest/handbook/concepts.html#concept-modes

mode 描述
1 1位像素,黑白,每字节存储一个像素
L 8位像素,黑白
8位像素,使用调色板映射到任何其他模式
RGB  3x8位像素,真彩色
RGBA  4x8位像素,带透明蒙版的真彩色
CMYK  4x8位像素,分色
YCbCr  3x8位像素,彩色视频格式
LAB  3x8位像素,L * a * b颜色空间
HSV  3x8位像素,色相,饱和度,值颜色空间
32位有符号整数像素
32位浮点像素

1位像素的范围是0-1,0表示黑1表示白,中间表示灰。8位像素的范围是0-255,如RGB的(0, 0, 0)表示黑,(255, 255, 255)表示白,依此类推。

2. 图片的模式转换

from PIL import Image
 
image = Image.open("yazi.jpg")
print(image.mode)
image1 = image.convert('1')
print(image1.mode)
# image1.show()
image_l = image.convert('L')
print(image_l.mode)
# image_l.show()
image_p = image.convert('P')
print(image_p.mode)
image_p.show()

运行结果:

RGBA

1

L

convert(self, mode=None, matrix=None, dither=None, palette=WEB, colors=256): 将当前图片转换为指定的模式,并且返回转换后的图片。如果不指定模式,则选择一种能保留图片所有信息且不使用调色板的模式(通常的结果是不转换)。将彩色图像转换为灰度('L')时,使用ITU-R 601-2进行亮度转换:L = R * 299/1000 + G * 587/1000 + B * 114/1000 。将灰度('L')或真彩('RGB')转换为模式'1'时,如果dither参数为'NONE',所有大于128的值均设置为255(白色),所有其他值都设为0(黑色)。

convert()方法有5个参数,都有默认值,根据转换的模式来传值:

mode,图片的模式,传入需要转换的模式。部分模式之间不支持转换,代码会报错。

matrix, 转换矩阵。传入该参数时,应该传入由浮点数构成的元组,元组长度为4或12。matrix只支持从少数模式转换成'L'或'RGB'。

dither, 高频振动,用于控制颜色抖动。从模式'RGB'转换为'P'或从'RGB'或'L'转换为'1'时使用。可用的方法有'NONE'或'FLOYDSTEINBERG'(默认)。当提供了matrix参数时不使用此功能。

palette, 调色板,用于控制调色板的产生。从模式'RGB'转换为'P'时使用,可用的方法有'WEB'(默认)或'ADAPTIVE'。'ADAPTIVE'表示使用自适应的调色板。

colors, 自适应调色板使用的颜色数。当palette参数为'ADAPTIVE'时,用于控制调色板的颜色数目。默认是最大值,即256种颜色。

2.1 matrix参数的效果对比

from PIL import Image

image = Image.open("yazi.jpg")
image_rgb = image.convert('RGB')
print(image_rgb.mode)
image_l = image_rgb.convert('L')
image_l.show()
matrix = (0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6)
image_l2 = image_rgb.convert('L', matrix=matrix)
image_l2.show()

运行结果:

Python Pillow(PIL)库的用法详解

上面的代码中,给matrix参数传入了一个长度为12的元组,matrix的值改变了转换的效果,变化程度取决于传入的元组中浮点数的值。注意,有些模式是不支持的,如'RGBA',且传入的元组长度必须为4或12,否则报错。

2.2 palette参数的效果对比

from PIL import Image
 
image = Image.open("yazi.jpg")
image_p = image.convert('P')
# image_l.show()
image_p2 = image.convert('P', palette='ADAPTIVE', colors=256)
image_p2.show()

运行结果:

Python Pillow(PIL)库的用法详解

上面的代码中,将palette参数改为了'ADAPTIVE',图片的差异不大,不过,如果将colors变小差异会比较大,但那样会将图片效果变差。

六、图片拷贝粘贴和保存

from PIL import Image
 
 
image = Image.open("yazi.jpg")
image_copy = image.copy()
# image_copy.show()
image_new = Image.new('RGB', (160, 90), (0, 0, 255))
image_new2 = Image.new('L', (160, 90), '#646464')
image_copy.paste(image_new, (100, 100, 260, 190), mask=image_new2)
image_copy.save('duck.jpg')
image_save = Image.open('duck.jpg')
print(image_save.format, image_save.mode)
image_copy.show()

运行结果:

jpg RGBA

Python Pillow(PIL)库的用法详解

copy(): 拷贝当前的图片,拷贝出来的图片与原图一模一样。如果想在图片上粘贴一些内容,又想保留原图时,可以使用此方法。

paste(im, box=None, mask=None): 将另一张图片粘贴到当前图片中,如果粘贴的模式不匹配,则将被粘贴图片的模式转换成当前图片的模式。有3个参数。

im, 被粘贴的图片。传入一张图片,当第二个参数box指定的是一个区域时,im参数也可以是一个整数或颜色值(元组表示,16进制表示和颜色名都可以,如上面代码中的image_new可以换成(0, 0, 255), '#0000FF', 'blue')。

box, 图片粘贴的位置或区域。传入一个长度为2或4的元组,如果不传值,默认为(0, 0),图片被粘贴在当前图片的左上角。如果传入长度为2的元组(x, y),表示被粘贴图片的左上角坐标位置。如果传入长度为4的元组(x1, y1, x2, y2),表示图片粘贴的区域,此时区域的大小必须与被粘贴图片一致,否则会报错,传入的元组长度为其他值也会报错。

mask, 蒙版。传入一张与被粘贴图片尺寸一样的图片,可以使用模式为'1'、'L'或者'RGBA'的图像。如果mask图像的颜色值为255,则直接按被粘贴图片的颜色粘贴,如果mask图像的颜色值为0,则保留当前图片的颜色(相当于没有粘贴),如果mask图像的颜色值为0~255之间的值,则将im与mask进行混合后再粘贴。

save(fp, format=None, **params): 将当前图片按指定的文件名保存,运行后会将图片按新名字保存在当前路径下(也可以指定路径)。文件名最好带扩展名,方便打开,format表示图片的格式,没有指定format则会根据扩展名来解析(如果能解析出来),一般不需要指定format,传入一个规范的文件名即可。

七、图片的裁剪和缩放

from PIL import Image
 
image = Image.open("yazi.jpg")
image_crop = image.crop(box=(300, 300, 800, 700))
# image_crop.show()
print('before resize: ', image.size)
image_resize = image.resize((500, 400), resample=Image.LANCZOS, box=(100, 100, 1200, 800), reducing_gap=5.0)
print('after resize: ', image_resize.size)
image_resize.show()

运行结果:

before resize:  (1557, 911)


Python Pillow(PIL)库的用法详解

crop(box=None): 裁剪图片,返回裁剪区域的图片。box表示裁剪的区域,传入长度为4的元组(x1, y1, x2, y2),不传默认为拷贝原图,相当于copy()方法,如果裁剪的区域超过了原图的区域,超出部分用像素格填充。

resize(size, resample=BICUBIC, box=None, reducing_gap=None): 缩放图片,返回缩放后的图片。有4个参数。

size, 图片缩放后的尺寸,传入一个长度为2的元组(width, height)。

resample, 重采样,是一个可选的重采样过滤器。可以传入Image.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING, Image.BICUBIC, Image.LANCZOS。默认过滤器为Image.BICUBIC。如果图像的模式为'1'或'P',则始终设置为Image.NEAREST。

box, 缩放图片的区域。传入长度为4的元组(x1, y1, x2, y2),这个区域必须在原图的(0, 0, width, height)范围内,如果超出范围会报错,如果不传值则默认将整张原图进行缩放。

reducing_gap, 减少间隙。传入一个浮点数,用于优化图片缩放效果,默认不进行优化,值大于3.0时优化效果基本已经是公平的重采样。

到此这篇关于Python Pillow(PIL)库的用法介绍的文章就介绍到这了,更多相关Python Pillow(PIL)库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python时区设置方法与pytz查询时区教程
Nov 27 Python
python基础教程之元组操作使用详解
Mar 25 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
从django的中间件直接返回请求的方法
May 30 Python
Python 使用类写装饰器的小技巧
Sep 30 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
Oct 31 Python
python绘图模块matplotlib示例详解
Jul 26 Python
python异常触发及自定义异常类解析
Aug 06 Python
django项目中使用手机号登录的实例代码
Aug 15 Python
Python 实现大整数乘法算法的示例代码
Sep 17 Python
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 Python
python迷宫问题深度优先遍历实例
Jun 20 Python
Python自动化xpath实现自动抢票抢货
Sep 19 #Python
python 贪心算法的实现
Sep 18 #Python
详解KMP算法以及python如何实现
Sep 18 #Python
python实现二分查找算法
Sep 18 #Python
Python自定义sorted排序实现方法详解
Sep 18 #Python
python爬虫爬取网页数据并解析数据
Sep 18 #Python
Python实现迪杰斯特拉算法过程解析
Sep 18 #Python
You might like
PHP中for循环语句的几种变型
2007/03/16 PHP
php 静态化实现代码
2009/03/20 PHP
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
php inc文件使用的风险和注意事项
2013/11/12 PHP
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
javascript 年月日联动实现核心代码
2009/12/21 Javascript
16个最流行的JavaScript框架[推荐]
2011/05/29 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】
2018/05/26 jQuery
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
2018/11/11 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
vue路由教程之静态路由
2019/09/03 Javascript
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
python列表去重的二种方法
2014/02/14 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
Python中GIL的使用详解
2018/10/03 Python
使用Python画出小人发射爱心的代码
2019/11/23 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
一个入门级python爬虫教程详解
2021/01/27 Python
超酷炫 CSS3垂直手风琴菜单
2016/06/28 HTML / CSS
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
创新比赛获奖感言
2014/02/13 职场文书
公司董事长岗位职责
2014/06/08 职场文书
护士工作失误检讨书
2014/09/14 职场文书
工程部文员岗位职责
2015/02/04 职场文书
2019年教师节:送给所有老师的祝福语
2019/09/05 职场文书