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中利用原始套接字进行网络编程的示例
May 04 Python
用Python编写一个每天都在系统下新建一个文件夹的脚本
May 04 Python
python实现数值积分的Simpson方法实例分析
Jun 05 Python
Pandas之DataFrame对象的列和索引之间的转化
Jun 25 Python
pandas如何处理缺失值
Jul 31 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
Jan 25 Python
django自带的权限管理Permission用法说明
May 13 Python
Python 如何测试文件是否存在
Jul 31 Python
Python提取视频中图片的示例(按帧、按秒)
Oct 22 Python
Python答题卡识别并给出分数的实现代码
Jun 22 Python
python 实现图片特效处理
Apr 03 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
ThinkPHP之A方法实例讲解
2014/06/20 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
JavaScript与HTML结合的基本使用方法整理
2015/10/12 PHP
总结PHP中数值计算的注意事项
2016/08/14 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
JavaScript中继承的一些示例方法与属性参考
2010/08/07 Javascript
首页图片漂浮效果示例代码
2014/06/05 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】
2019/02/21 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
微信小程序图片加载失败时替换为默认图片的方法
2019/12/09 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
详解Vite的新体验
2021/02/22 Javascript
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
python实现基本进制转换的方法
2015/07/11 Python
Python人脸识别初探
2017/12/21 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
利用Django-environ如何区分不同环境
2018/08/26 Python
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
python多线程调用exit无法退出的解决方法
2019/02/18 Python
python读取大文件越来越慢的原因与解决
2019/08/08 Python
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
机械工程系毕业生求职信
2013/09/27 职场文书
机修工工作职责
2014/02/21 职场文书
2014年师德承诺书
2014/05/23 职场文书
2014年车间主任工作总结
2014/12/10 职场文书
运动会表扬稿范文
2015/05/05 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书