武汉老站长

 找回密码
 立即注册
点击联系客服
客服QQ: 客服微信:
查看: 452|回复: 50

[Python入门到精通] (26)用Python的PIL库处理图像真的很容易

[复制链接]

1

主题

1

帖子

-7

积分

限制会员

积分
-7
发表于 2021-9-30 07:40:43 | 显示全部楼层 |阅读模式
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦本篇重点介绍Python处理图像的标准库PIL库,处理图像真的的很方便。

干货满,建议收藏,要经常看。小伙伴们有疑问和需要的话,请争先恐后地留言~ ~ ~。

文章目录

前言Pillow安装和版本兼容通用模块介绍imageimagecolorimagefontimagedraw介绍请再给我一些干燥产品!组合美女照片摘要参考源地址python知识地图

前言

Phil库Python图像库已经是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=={版本},其中版本应替换为指定的版本号(例如,下载版本8.3.0)。

Pip  install  Pillow==8.3.0

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

下表是Pillow和Python的版本映射表。





常用模块介绍

PIL库有很多模块,这里重点介绍一些常用的模块。首先,从整体上看一下每个模块的作用。

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

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

[ol]
  • 加载图片文件[/ol]
    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
  • 展示图片show()[/ol]
    img.show()
  • 图片旋转,通过rotate方法对图片进行旋转,下面就是将图片旋转45度展示出来。[/ol]
       img.rotate(45).show()
  • 图片缩放,通过thumbnail方法可以实现对图片的缩放。[/ol]
        img.thumbnail((width / 2, height / 2))
  • 保存图片[/ol]
    save(self, fp, format=None, **params)

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

        img.save('thumbnail.jpeg')
  • 创建新Image[/ol]
    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')
  • 复制图片,通过copy()方法,可以copy一个图片。[/ol]
      # 复制图片
        copyImg = img.copy()
        newImg.save(op.join(base_path, 'copyImg.png'))
  • 粘贴图片:通过 paste方法可以将一个图片粘贴到另一个图片之上。[/ol]
    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模块了,这个模块也是一个非常重要的模块,它主要是可以给图片添加文字以及划线等。

    [ol]
  • Draw方法[/ol]
    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还是透明底的。



    [ol]
  • 直接上paste方法[/ol]
    # 将两张图贴起来
    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从入门到精通,我从CSDN官方那边搞来了一套 《Python全栈知识图谱》,尺寸 870mm x 560mm,展开后有一张办公桌大小,也可以折叠成一本书的尺寸,有兴趣的小伙伴可以了解一下------扫描下图中的二维码即可购买。


    我本人也已经用上了,感觉非常好用。图谱桌上放,知识心中留。




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

  • 回复

    使用道具 举报

    0

    主题

    679

    帖子

    -555

    积分

    限制会员

    积分
    -555
    发表于 2021-9-30 07:46:44 | 显示全部楼层
    真是 收益 匪浅
    回复

    使用道具 举报

    0

    主题

    676

    帖子

    -591

    积分

    限制会员

    积分
    -591
    发表于 2021-9-30 08:09:21 | 显示全部楼层
    不错不错,很好哦
    回复

    使用道具 举报

    0

    主题

    692

    帖子

    -579

    积分

    限制会员

    积分
    -579
    发表于 2021-9-30 08:31:31 | 显示全部楼层
    学习了,不错,讲的太有道理了
    回复

    使用道具 举报

    0

    主题

    679

    帖子

    -561

    积分

    限制会员

    积分
    -561
    发表于 2021-9-30 09:02:15 | 显示全部楼层
    LZ真是人才
    回复

    使用道具 举报

    0

    主题

    735

    帖子

    -631

    积分

    限制会员

    积分
    -631
    发表于 2021-9-30 09:22:16 | 显示全部楼层
    LZ说的很不错
    回复

    使用道具 举报

    0

    主题

    687

    帖子

    -592

    积分

    限制会员

    积分
    -592
    发表于 2021-9-30 09:53:59 | 显示全部楼层
    不错,支持下楼主
    回复

    使用道具 举报

    0

    主题

    687

    帖子

    -550

    积分

    限制会员

    积分
    -550
    发表于 2021-9-30 10:14:01 | 显示全部楼层
    LZ说的很不错
    回复

    使用道具 举报

    0

    主题

    678

    帖子

    -560

    积分

    限制会员

    积分
    -560
    发表于 2021-9-30 10:47:16 | 显示全部楼层
    看帖回帖是美德!
    回复

    使用道具 举报

    0

    主题

    667

    帖子

    -545

    积分

    限制会员

    积分
    -545
    发表于 2021-9-30 11:09:06 | 显示全部楼层
    沙发!沙发!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|无图版|手机版|小黑屋|武汉@IT精英团

    GMT+8, 2022-6-28 01:09 , Processed in 0.220984 second(s), 25 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表