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生成验证码实例
Aug 21 Python
深入Python解释器理解Python中的字节码
Apr 01 Python
Python使用folium excel绘制point
Jan 03 Python
Python使用dict.fromkeys()快速生成一个字典示例
Apr 24 Python
Pytorch加载部分预训练模型的参数实例
Aug 18 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
Python 中如何实现参数化测试的方法示例
Dec 10 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
Apr 14 Python
python制作抽奖程序代码详解
Jan 15 Python
python反编译教程之2048小游戏实例
Mar 03 Python
浅谈Python numpy创建空数组的问题
May 25 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
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
测试PHP连接MYSQL成功与否的代码
2013/08/16 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
探究react-native 源码的图片缓存问题
2017/08/24 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
基于JS实现一个随机生成验证码功能
2019/05/29 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
解决vue刷新页面以后丢失store的数据问题
2020/08/11 Javascript
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
Python打包方法Pyinstaller的使用
2018/10/09 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
python pandas读取csv后,获取列标签的方法
2018/11/12 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
单位创先争优活动方案
2014/01/26 职场文书
小学运动会演讲稿
2014/08/25 职场文书
新教师个人工作总结
2015/02/06 职场文书
催款函范文
2015/06/24 职场文书
感恩父母主题班会
2015/08/12 职场文书
pycharm代码删除恢复的方法
2021/06/26 Python
MySQL query_cache_type 参数与使用详解
2021/07/01 MySQL
Django中session进行权限管理的使用
2021/07/09 Python
能用CSS实现的就不要麻烦JavaScript了
2021/10/05 HTML / CSS