乐趣区

关于python:❤️Python从入门到精通二十六用Python的PIL库Pillow处理图像真的得心应手❤️

您好,我是码农飞哥,感谢您浏览本文,欢送一键三连哦
本篇重点介绍 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 对象。

  1. 获取图片的宽,高。通过 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(将绘图混合到图像中)。对于所有其余模式,此参数必须与图像模式雷同,如果省略,模式默认是图像的模式。

  1. 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 上之后背景色变成了彩色,这显然没有达到咱们冀望的后果。这该如何解决呢?
问题不大,只须要小小的批改一下代码.

  1. 小小批改一下,将背景改成通明底
# 通明底
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/…

我是码农飞哥,再次感谢您读完本文
全网同名【码农飞哥】。不积跬步,无以至千里,享受分享的高兴
我是码农飞哥,再次感谢您读完本文

退出移动版