您好,我是码农飞哥,感谢您浏览本文,欢送一键三连哦
本篇重点介绍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库有很多模块,这里重点介绍一些罕用的模块。首先,总体来看下各个模块的作用。

模块名次要作用
ImageImage模块提供了一个具备雷同名称的类用于示意PIL的image对象,它有许多工厂类,包含从文件中加载image以及创立新的image
ImageColorImageColor 模块蕴含了CSS3中的色彩说明符到RGB元组的色彩表和转换器,这个模块在PIL.Image.new()和ImageDraw模块以及其余模块应用
ImageFontImageFont 用于设置字体,它次要用在PIL.ImageDraw.ImageDraw.text() 办法中。
ImageDrawImageDraw 模块为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/...

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