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通过shutil实现快速文件复制的方法
Mar 14 Python
Python的string模块中的Template类字符串模板用法
Jun 27 Python
Python合并字典键值并去除重复元素的实例
Dec 18 Python
Python实现简易版的Web服务器(推荐)
Jan 29 Python
python爬取淘宝商品详情页数据
Feb 23 Python
Python根据已知邻接矩阵绘制无向图操作示例
Jun 23 Python
python贪吃蛇游戏代码
Apr 18 Python
Python将列表数据写入文件(txt, csv,excel)
Apr 03 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
Java如何基于wsimport调用wcf接口
Jun 17 Python
class类在python中获取金融数据的实例方法
Dec 10 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 按位与或 (^ 、&)
2013/06/21 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
JS实现div居中示例
2014/04/17 Javascript
javascript 回调函数详解
2014/11/11 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
2015/12/24 Javascript
js轮播图代码分享
2016/07/14 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
微信小程序 地图定位简单实例
2016/10/14 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
美国电视购物:QVC
2017/02/06 全球购物
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
生物学学生自我评价
2014/01/17 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
大学生违纪检讨书300字
2014/10/25 职场文书
反腐倡廉观后感
2015/06/08 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers