您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦

本篇重点介绍Python处理图像的标准库PIL库,处理图像真的的很方便。

干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。

前言

PIL库 Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。但是PIL库仅仅支持到Python 2.7。为了兼容Python 3.x开源社区提供了兼容版本Pillow,通过Pillow大家就可以愉快的在Python 3.x上使用PIL库了。

安装Pillow 以及版本兼容

通过pip命令安装Pillow还是非常方便的,一行命令就可以

安装最新版本的命令

pip install  Pillow

安装指定版面的命令pip install Pillow=={version} 这里的version需要替换成指定的版本号,比如要下载8.3.0版本。

pip install Pillow==8.3.0

如果你不知道有哪些版本可以通过pip install Pillow== 进行查看。

下表是Pillow与Python的版本对应表。

常用模块介绍

PIL库有很多模块,这里重点介绍一些常用的模块。首先,总体来看下各个模块的作用。

模块名 主要作用
Image Image模块提供了一个具有相同名称的类用于表示PIL的image对象,它有许多工厂类,包括从文件中加载image以及创建新的image
ImageColor ImageColor 模块包含了CSS3中的颜色说明符到RGB元组的颜色表和转换器,这个模块在PIL.Image.new()和ImageDraw模块以及其他模块使用
ImageFont ImageFont 用于设置字体,它主要用在PIL.ImageDraw.ImageDraw.text() 方法中。
ImageDraw ImageDraw 模块为Image模块提供了简单的2D图形,利用该模块可以创建新图形,修饰现有图形,然后生成新的图形以供使用

下面就详细介绍下各个模块的

Image

Image是PIL库的核心模块,大部分图片的操作都离不开它,利用它可以从文件中加载image,以及创建新的image。以及将Images保存为图片。

  1. 加载图片文件
PIL.Image.open(fp, mode='r', formats=None)

其中 fp是图片文件名称,mode 表示图片路径的读取模式,默认是'r'模块。返回Image对象

try:
img = Image.open("img1.jpeg")
finally:
# 这种打开方式需要手动关闭文件流
img.close()

这里Image使用完成之后需要手动关闭。比较推荐下面的with ... as ... 的写法

with Image.open('img1.jpeg') as img:

下面列举的img都是前面通过open获取到的Image对象。

2. 获取图片的宽,高。通过img.size 可以获取图片的宽,高。i

    width, height = img.size
  1. 展示图片show()
img.show()
  1. 图片旋转,通过rotate方法对图片进行旋转,下面就是将图片旋转45度展示出来。
   img.rotate(45).show()
  1. 图片缩放,通过thumbnail方法可以实现对图片的缩放。
    img.thumbnail((width / 2, height / 2))
  1. 保存图片
save(self, fp, format=None, **params)

该方法可以将Image对象保存为一个图片文件。其中:fp为图片保存的路径。**params是可变参数,一般是传入图片的后缀名。

    img.save('thumbnail.jpeg')
  1. 创建新Image
PIL.Image.new(mode, size, color=0)

该方法有三个参数,mode用于指定生成的图片是RGB还是RGBA。这里RGBA各个字母表示的意思是:r 表示red, g 表示gree, b表示blue,a 表示alpha 透明度。一般而言只需要指定RGB即可。如果需要创建一个透明底的图片则需要传入RGBA。

size 用于指定图片的宽高,传入的是一个元组。

color 用于指定图片的颜色,如果前面mode传入的是RGB的话,则该参数需要传入含有三个元素的元组。比如:(255, 0, 0),如果前面mode传入的是RGBA的话,则该参数需要传入含有四个元素的元素,比如:(255,0,0,204)。

下面的代码就是创建一个宽高各为500的,背景色是红色的图片。

 newImg = Image.new('RGB', (500, 500), (255, 0, 0))
newImg.save('newImg.png')
  1. 复制图片,通过copy()方法,可以copy一个图片。
  # 复制图片
copyImg = img.copy()
newImg.save(op.join(base_path, 'copyImg.png'))
  1. 粘贴图片:通过 paste方法可以将一个图片粘贴到另一个图片之上。

ImageColor

该模块主要是从CSS3中的颜色说明符中获取到RGB值。这里说一个方法:getrgb 方法就是获取RGB值。

# 获取颜色的RBGA值
rgb_tup = ImageColor.getrgb("#ff0000cc")
print(rgb_tup)

运行结果是(255, 0, 0, 204)

ImageFont

ImageFont 用于设置字体,它主要用在PIL.ImageDraw.ImageDraw.text() 方法中。首先,这里介绍其最常用的方法

PIL.ImageFont.truetype (font = None , size = 10 , index = 0 , encoding = '' , layout_engine = None )

从文件或类文件对象加载 TrueType 或 OpenType 字体,并创建字体对象。该函数从给定的文件或类文件对象加载一个字体对象,并为给定大小的字体创建一个字体对象。

Pillow 使用 FreeType 打开字体文件。如果您在 Windows 上同时打开多种字体,请注意 Windows 将可以在 C 中同时打开的文件数限制为 512。如果接近该限制,OSError可能会抛出an ,报告 FreeType“无法打开资源”。

此功能需要 _imagingft 服务。

参数

font – 包含 TrueType 字体的文件名或类似文件的对象。如果在此文件名中找不到该文件,加载程序也可能会在其他目录中进行搜索,例如fonts/ Windows 或 上的目录/Library/Fonts/, /System/Library/Fonts/以及~/Library/Fonts/macOS上的目录。

size – 请求的大小,以磅为单位。

index – 要加载的字体(默认是第一个可用的字体)。

encoding—要使用的字体编码(默认为 Unicode)。可能的编码包括(有关更多信息,请参阅 FreeType 文档):

这指定要使用的字符集。它不会改变后续操作中提供的任何文本的编码。

layout_engine 要使用的布局引擎(如果可用): ImageFont.LAYOUT_BASIC或ImageFont.LAYOUT_RAQM.

返回值

一个字体对象。

img_font = ImageFont.truetype('simsun.ttf', size=20)

这里代码的意思是创建一个字体大小为20的宋体的字体。

ImageDraw

终于说到ImageDraw模块了,这个模块也是一个非常重要的模块,它主要是可以给图片添加文字以及划线等。

  1. Draw方法
PIL.ImageDraw.Draw(im, mode=None)

给指定的Image对象创建一个draw对象。

参数:

im: 需要被绘画的image对象

mode: 用于颜色值的可选模式,对于RGB图像,此参数可以是RGB或者RGBA(将绘图混合到图像中)。对于所有其他模式,此参数必须与图像模式相同,如果省略,模式默认是图像的模式。

2. text方法

ImageDraw.text(xy, text, fill=None, font=None, anchor=None, spacing=4, align='left', direction=None, features=None, language=None, stroke_width=0, stroke_fill=None, embedded_color=False)

在给定的位置上添加文本

参数:

xy – 文本的锚点坐标。

text – 要绘制的字符串。如果它包含任何换行符,则文本将传递给 multiline_text()。

fill- 用于文本的颜色。

font- 一个ImageFont实例。

anchor—— 文本锚对齐方式。确定锚点与文本的相对位置。默认对齐方式是左上角。有关有效值,请参阅文本锚点。对于非 TrueType 字体,将忽略此参数。此参数存在于 Pillow 的早期版本中,但仅在 8.0.0 版中实现。

spacing– 如果文本传递到multiline_text(),则为 行之间的像素数。

align- 如果文本被传递到 multiline_text(), "left","center"或"right"。确定线条的相对对齐方式。使用anchor参数指定对齐到xy。

direction——文本的方向。它可以是"rtl"(从右到左)、"ltr"(从左到右)或"ttb"(从上到下)。需要 libraqm。

features—— 要在文本布局期间使用的 OpenType 字体功能列表。这通常用于打开默认情况下未启用的可选字体功能,例如"dlig"或"ss01",但也可用于关闭默认字体功能,例如"-liga"禁用连字或"-kern" 禁用字距调整。要获取所有支持的功能,请参阅OpenType 文档。需要 libraqm。

language—— 文本的语言。不同的语言可能使用不同的字形形状或连字。此参数告诉字体文本使用的语言,并根据需要应用正确的替换(如果可用)。它应该是BCP 47 语言代码。需要 libraqm。

stroke_width–文本笔划的宽度。

stroke_fill – 用于文本笔划的颜色。如果没有给出,将默认为fill参数。

embedded_color– 是否使用字体嵌入颜色字形(COLR、CBDT、SBIX)。8.0.0 版中的新功能。

# 给图片上添加文字
with Image.open(op.join(base_path, 'img4.jpeg')) as im:
font = ImageFont.truetype(op.join(base_path, 'simsun.ttf'), size=80)
rgb_tup = ImageColor.getrgb("#ff0000cc")
draw = ImageDraw.Draw(im)
text = "玛莎拉蒂"
draw.text((650, 550), text, fill=rgb_tup, font=font)
im.save(op.join(base_path, '玛莎拉蒂.png'), 'png')

运行结果是:

再来点干货吧!

前面都是基础性的介绍,不够干,不够过瘾。下面作者就再来点干货,希望读者朋友们满意。

合并美女照片

现在有这两张美女照片分别是:img2.jpeg和img3.png。我想把img3.png粘贴到img2.jpeg上。该如何操作呢? 其中img3.png还是透明底的。

  1. 直接上paste方法
# 将两张图贴起来
img2 = Image.open('img2.jpeg')
img3 = Image.open('img3.png')
img2.paste(img3)
img2.save('beautiful_paste.jpeg')

运行结果是:



img3.png 图片粘贴到img2上之后背景色变成了黑色,这显然没有达到我们期望的结果。这该如何处理呢?

问题不大,只需要小小的修改一下代码.

3. 小小修改一下,将背景改成透明底

# 透明底
img2 = Image.open('img2.jpeg').convert('RGBA')
img3 = Image.open('img3.png').convert('RGBA')
# 获取r,g,b,a的值
r, g, b, a = img3.split()
# 传入透明值
img2.paste(img3, box=(0, 0), mask=a)
img2.save('beautiful_paste2.png')

运行结果是:



这下就变成了透明底了。两位美女都可以尽情欣赏了。

总结

本文详细介绍了PIL库的使用,希望对读者朋友们有所帮助。

参考

Pillow官方文档

关于 Image.paste() 透明像素问题【PIL-Python】

源码地址

https://gitee.com/jayxiang31/python_demo/tree/master/pil

我是码农飞哥,再次感谢您读完本文

全网同名【码农飞哥】。不积跬步,无以至千里,享受分享的快乐

我是码农飞哥,再次感谢您读完本文

❤️【Python从入门到精通】(二十六)用Python的PIL库(Pillow)处理图像真的得心应手❤️的更多相关文章

  1. 【Python从入门到精通】(九)Python中字符串的各种骚操作你已经烂熟于心了么?

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文将重点介绍Python字符串的各种常用方法,字符串是实际开发中经常用到的,所有熟练的掌握它的各种用法显得尤为重要. 干货满满,建议收藏,欢迎大 ...

  2. Python学习之旅(二十六)

    Python基础知识(25):常用内建模块 1.datetime:处理日期和时间 (1)获取当前日期和时间 from datetime import datetime now = datetime.n ...

  3. 二十六、python中json学习

    1.json序列介绍:提供4个关键字:dumps,dump,loads,load(与pickle用法完全相同) 语法:f.write(bytes(json.dumps(dict),encoding=& ...

  4. Spring Boot入门系列(二十六)超级简单!Spring Data JPA 的使用!

    之前介绍了Mybatis数据库ORM框架,也介绍了使用Spring Boot 的jdbcTemplate 操作数据库.其实Spring Boot 还有一个非常实用的数据操作框架:Spring Data ...

  5. Scala入门到精通——第十六节 泛型与注解

    本节主要内容 泛型(Generic Type)简单介绍 注解(Annotation)简单介绍 注解经常使用场景 1. 泛型(Generic Type)简单介绍 泛型用于指定方法或类能够接受随意类型參数 ...

  6. Simulink仿真入门到精通(十六) Simulink基于模型设计的工业应用概述

    16.1 Simulink用途概述 在基于模型设计广泛应用于汽车电子嵌入式开发的今天,MBD(Model Besed Design)技术也逐步推广到各种嵌入式控制方面.与传统的嵌入式开发相比,BMD以 ...

  7. 【Python从入门到精通】(十一)Python的函数的方方面面【收藏下来保证有用!!!】

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文主要介绍Python的函数,函数的定义,使用,可变参数等等都有详细介绍. 干货满满,建议收藏,需要用到时常看看. 小伙伴们如有问题及需要,欢迎 ...

  8. javaweb学习总结(二十六)——jsp简单标签标签库开发(二)

    一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...

  9. javaweb(二十六)——jsp简单标签标签库开发(二)

    一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...

随机推荐

  1. 并发容器之ConcurrentHashMap

    JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都 串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低 ...

  2. C语言格式化输出语句

    %d:带符号十进制整数 : %c:单个字符: %s:字符串: %f:6位小数:float; %.2f表示小数点后精确到两位 %lf:6位小数:double;

  3. 嵌入式Linux的启动过程

    1.了解 Linux 最初是由瑞典赫尔辛基大学的学生 Linus Torvalds在1991 年开发出来的,之后在 GNU的支持下,Linux 获得了巨大的发展.虽然 Linux 在桌面 PC 机上的 ...

  4. Session原理、生命周期及购物车功能的实现

    在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据(保存该浏览器(会话)的相关信息)时 ...

  5. 基于Nginx实现负载均衡的部署

    Nginx(enginex)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器. nginx官方网站:http://nginx.org/ nginx plus收费软件, ...

  6. Python中管理数据库

    前言:Python中是利用MySQL模块和数据库之间建立联系. MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL ...

  7. python库--tensorflow--可视化

    方法 返回值类型 参数 说明 tf.summary .FileWrite()   创建事件文件     logdir 文件保存路径(C盘), 通过tensorboard --logdir=文件路径(l ...

  8. Python - poetry(3)配置项详解

    config 命令 poetry 通过 config 命令进行配置 也可以直接在 config.toml 文件中进行配置,该文件将在首次运行该命令时自动创建 文件目录 macOS:~/Library/ ...

  9. NPOI相关资料

    http://blog.csdn.net/heyangyi_19940703/article/details/52292755 http://www.cnblogs.com/zhengjuzhuan/ ...

  10. 动态规划精讲(一)LC最长公共子序列

    P1439 [模板]最长公共子序列 题目描述 给出1,2,-,n 的两个排列P1​ 和P2​ ,求它们的最长公共子序列. 输入格式 第一行是一个数 n. 接下来两行,每行为 n 个数,为自然数 1,2 ...