• 自学Python第二十三天- pillow 库,图形处理及绘画



    pillow 是 python 的一个比较常用的图形处理及绘制的第三方库

    pillow 的安装及引用

    pip install pillow
    
    • 1
    from PIL import Image, ImageDraw
    
    • 1

    图形基础 Image 类

    pillow 最基础最常用的就是 Image 类了,它可以创建、载入一张图片,然后进行进一步的处理

    创建图片

    使用 Image 的 new 方法可以创建一个新的图形对象,格式为 PIL.Image.new(mode, size, color=0) -> PIL.Image.Image

    • mode :图形模式,最常用的格式为 RGB (三色模式) 和 RGBA (带 alpha 通道即透明效果的 RGB 模式)。
      RGB 模式下每个像素信息为三字节,分别表示该像素的红绿蓝值,取值范围 0-255 共256级,数值越大该色越亮,所以 (0,0,0) 为最暗是黑色,(255,255,255)为最亮是白色。RGBA 模式下多了一个字节的透明度,0为图形最暗即完全透明,255为图形最亮即完全不透明。
    • size :创建图形的大小,有一个元组 (x,y) 表示,单位像素。
    • color :创建图形的颜色,是一个颜色元组,需要和 mode 相匹配。
    img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255)) 	# 创建一个 120x30 大小的白色的 RGB 图形
    new_img = Image.new(mode='RGBA', size=(200, 100), color=(255, 255, 255, 0))		# 创建一个 200x100 大小的白色且完全透明的 RGBA 图形
    
    • 1
    • 2

    通常创建的图形可以作为“画布”,之后各种处理和绘画都会在画布上进行。

    加载图片

    使用 Image 的 open 方法可以加载一个图形文件,格式为 PIL.Image.open(fp, mode="r", formats=None) ->PIL.Image.Image

    • fp :即 filepath ,文件路径
    • mode :加载模式,默认只读
    • format :使用那种图形格式来加载图片文件,默认 None 即尝试所有支持的文件格式
    image = Image.open('image.png')
    
    • 1

    Image 图形对象的常用方法和属性

    当加载或创建了一个图形对象后,可以使用一些方法对其进行操作

    resize 方法

    使用 resize 方法可以重新调整大小,格式为 Image.resize(size, resample=None, box=None, reducing_gap=None) ->PIL.Image.Image

    • size : 调整后的大小,一个由宽和高组成的二元元组,单位是像素
    • resample : 重采样过滤器
    • box : 一个可选的4元元组浮点数,提供要缩放的源图像区域。这些值必须在 (0, 0, width, height) 矩形内。默认无表示整个源图像
    • reducing_gap : 采样优化
    image = Image.open('image.png')
    imgae.resize((500, 400))
    
    • 1
    • 2

    需注意的是可能出现比例失调以及锯齿化的情况

    convert 方法

    convert 方法可以转换图像模式,其格式为 Image.convert(mode=None, matrix=None, dither=None, palette=Palette.WEB, colors=256)

    • mode : 转换的模式,默认不转换,常用的参数类型有 L (灰度,8位)、RGB(三原色,8x3位)、RGBA(带alpha通道的三原色,8x4位)、1(黑白,1位像素但存储为8位)、YCbCr(彩色视频格式,3x8位)
    im = im.convert('L')
    
    • 1

    paste 方法

    可以使用 paste 方法将一个 Image 对象粘贴当前对象中,格式为 Image.paste(im, box=None, mask=None)

    • im : 要复制的 Image 对象
    • box : 使用4元元组表示要粘贴到当前对象的位置及大小,使用2元元组表示粘贴大小(位置为默认的 0,0),默认为None表示坐标(0,0)处粘贴且不改变大小
    • mask :遮罩图像
    image = Image.open('image.png')
    img = Image.open('small_imgae.png')
    image.paste(img, (50, 50, 100, 100))
    
    • 1
    • 2
    • 3

    rotate 方法

    rotate 方法可以选择图像,格式为 Image.rotate(angle,expand=0,center=None,fillcolor=None)->Image

    • angle : 以逆时针方向选择的角度
    • expand : 如果为真,则扩展输出图像以使其足够大以容纳整个旋转图像。如果为 false 或省略,则使输出图像与输入图像大小相同。
    • center : 选择中心坐标,以图像左上角为原点
    • fillcolor : 旋转后没有图像信息的像素的填充颜色
    image = image.rotate(90)
    
    • 1

    filter 方法

    filter 方法可以进行图像滤波,主要是对图像进行平滑、锐化、边界增强等滤波处理。格式为 Image.filter(filter)->Image

    filter 是过滤器,是 pillow 里的一个类: ImageFilter,较常使用的有:

    • BLUR :模糊
    • CONTOUR :轮廓
    • DETAIL :细节
    • EDGE_ENHANCE : 边缘强化
    • EMBOSS :浮雕
    • FIND_EDGES :边缘突出
    • SHARPEN :锐化
    • SMOOTH :平滑
    img = img.filter(ImageFilter.EMBOSS)
    
    • 1

    load 方法

    用于获取图像的像素信息,返回值是一个存储了像素信息的矩阵。

    pix_info = img.load()		# 获取 img 的像素信息,因为是矩阵,所以可用使用坐标进行定位
    pix = pix_info[100, 200]		# 返回目标坐标的像素信息
    
    • 1
    • 2

    show 方法

    当处理完图像时,可以使用 show 方法进行查看。show 方法将创建一个临时文件,并使用默认图像浏览软件打开这个临时文件。

    image = Image.open('image.png')
    image.show(title=None)		# title 是打开图像的标题
    
    • 1
    • 2

    save 方法

    save 方法用于保存为文件,格式为 Image.save(fp, format=None)

    • fp : filepath,文件路径
    • format : 保存格式
    image.save('image.png')
    
    • 1

    size 属性

    可以使用 size 属性获取对象的宽和高

    width, height = img.size
    
    • 1

    释放对象资源

    使用 Image.close() 方法关闭对象并释放资源

    文本图形 ImageFont 类

    ImageFont 用于处理图像中的文本

    从字体文件创建图形的字体对象

    使用 ImageFont 的 truetype 方法,可以从 TrueType 类型的字体文件创建图形的字体对象。相当于画板中输入文本的工具。

    格式为 ImageFont.truetype(font=None, size=10, index=0, encoding="", layout_engine=None) -> Font

    • font : 字体文件的文件名,如果当前目录没有此文件则会在系统字体文件夹内查找
    • size : 字体的大小,单位为像素
    • index : 需要从字体文件中加载的字体,默认第一个可用的字体
    • encoding : 编码格式,默认为 unicode
    • layout_engine : 使用的引擎
    font = ImageFont.truetype('msyh_boot.ttf',size=28)
    
    • 1

    ImageFont 字体的常用方法

    getbbox 方法

    getbbox 方法可以根据一段文本获取其相对于给定锚点的相对位置及大小(getsize方法即将不再使用,用此方法进行替代),格式为 ImageFont.getbbox(text,mode="",direction=None,features=None,language=None,stroke_width=0,anchor=None) -> tuple(left, top, right, bottom)

    • text : 渲染的文本
    • direction : 文本方向,例如 rtl (右到左) 、ttb (上到下) 等,需要库支持
    • language : 文本语言
    • stroke_width : 文本笔划的宽度
    • anchor : 文本对其锚点,默认左上角
    print(font.getbbox('x'))		# (0, 0, 8, 11) 即锚点位置 0, 0  渲染的文本大小为 (8-0, 11-0)
    
    • 1

    绘画 ImageDraw 类

    ImageDraw 用于绘制图形

    创建绘画对象

    使用 ImageDraw 的 Draw 方法能够创建一个绘画对象,在一个 Image 对象上绘制图形。格式为 ImageDraw.Draw(im, mode=None) ->ImageDraw

    • im : 要绘制图形的 Image 对象
    • mode : 创建的模式,类似于 Image 对象的 mode 模式
    img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
    draw = ImageDraw.Draw(img, mode='RGB')
    
    • 1
    • 2

    画点

    使用 ImageDraw 的 point 方法可以绘制一个点。格式为 ImageDraw.point(xy, fill=None)

    • xy : 要绘制点的坐标,二元元组
    • fill : 绘制的颜色,可以是 ‘red’、‘black’ 等预设的颜色字符串或 RGB 色
    draw = ImageDraw.Draw(img, mode='RGB')
    draw.point((100, 20), fill='black')
    
    • 1
    • 2

    画线

    使用 ImageDraw 的 line 方法绘制一条线。格式为 ImageDraw.line(xy, fill=None, width=0, joint=None)

    • xy : 要绘制的线的坐标,4元元组,表示起点坐标和终点坐标
    • fill : 绘制的颜色,可以是 ‘red’、‘black’ 等预设的颜色字符串或 RGB 色
    • width : 绘制线宽度,单位像素
    draw.line((10, 10, 100, 20), fill=(0, 0, 0))
    
    • 1

    画圆

    使用 ImageDraw 的 arc 方法绘制圆形。格式为 ImageDraw.arc(xy, start, end, fill=None, width=1)

    • xy : 要绘制圆形所在的正方形位置,四元元组,表示正方形的左上角和右下角坐标
    • start : 绘制圆形的开始角度,以三点钟方向为 0 度,顺时针
    • end : 绘制圆形的结束角度,以三点钟方向为 0 度,顺时针
    • fill : 绘制的颜色
    • width : 绘制的宽度
    draw.arc((10, 10, 100, 100), 0, 270, fill='red', width=4)
    
    • 1

    画文本

    使用 ImageDraw 的 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 : 文本内容
    • fill : 绘制的颜色
    • font : 使用的字体对象 (ImageFont对象)
    draw.text((10, 10), 'hello world', fill='red')
    
    • 1
  • 相关阅读:
    RabbitMQ(高级特性) 设置队列所有消息存活时间
    兆易创新GD32 (四)FreeRTOS 移植 与 CMSIS OS2
    计算机毕业设计之java+javaweb的外婆家网上订餐平台
    16种最好的方法,你可以推动过去的拖延
    C++内存模型与名称空间总结,看这一篇就够了
    .NET Apache Spark做基于商品推荐系统如此简单
    python自动化测试(二):xpath获取元素
    Web3.0与机器学习
    设计模式——结构型模式(静态代理、JDK动态代理)
    智慧校园建设的进阶之路
  • 原文地址:https://blog.csdn.net/runsong911/article/details/126153052