栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

自学Python第二十三天- pillow 库,图形处理及绘画
  • pillow 的安装及引用
  • 图形基础 Image 类
    • 创建图片
    • 加载图片
    • Image 图形对象的常用方法和属性
      • resize 方法
      • convert 方法
      • paste 方法
      • rotate 方法
      • filter 方法
      • load 方法
      • show 方法
      • save 方法
      • size 属性
    • 释放对象资源
  • 文本图形 ImageFont 类
    • 从字体文件创建图形的字体对象
    • ImageFont 字体的常用方法
      • getbbox 方法
  • 绘画 ImageDraw 类
    • 创建绘画对象
    • 画点
    • 画线
    • 画圆
    • 画文本

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

pillow 的安装及引用
pip install pillow
from PIL import Image, ImageDraw
图形基础 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 图形

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

加载图片

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

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

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

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')
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))
rotate 方法

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

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

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

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

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

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

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

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

image = Image.open('image.png')
image.show(title=None)		# title 是打开图像的标题
save 方法

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

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

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

width, height = img.size
释放对象资源

使用 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)
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)
绘画 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')
画点

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

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

使用 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))
画圆

使用 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)
画文本

使用 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')
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033191.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号