Python图片处理库PIL的使用

jupiter
2021-02-05 / 0 评论 / 918 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年12月07日,已超过809天没有更新,若内容或图片失效,请留言反馈。

Python图片处理库PIL的使用

1.加载图片、查看文件信息

1.1加载图片。

  • 图片地址可以是相对路径,也可以是相对路径
  • 如果文件打开失败, 将抛出IOError异常。
from PIL import Image
img = Image.open(图片地址)

1.2显示图片

img.show()

1.3查看图片属性

  • format属性指定了图像文件的格式,如果图像不是从文件中加载的则为None。
  • size属性是一个2个元素的元组,包含图像宽度和高度(像素)。
  • mode属性定义了像素格式,常用的像素格式为:“L” (luminance) - 灰度图, “RGB” , “CMYK”。
print(img.format, img.size, img.mode)
JPEG (750, 300) RGB

1.4 保存图片

img.save("./save.jpg")

2.使用滤镜

2.0 使用方式

from PIL import ImageFilter #滤镜所需要的包
img.filter(滤镜效果)

常用滤镜有如下:

滤镜名称含义
ImageFilter.BLUR模糊滤镜
ImageFilter.CONTOUR轮廓
ImageFilter.EDGE_ENHANCE边界加强
ImageFilter.EDGE_ENHANCE_MORE边界加强(阀值更大)
ImageFilter.EMBOSS浮雕滤镜
ImageFilter.FIND_EDGES边界滤镜
ImageFilter.SMOOTH平滑滤镜
ImageFilter.SMOOTH_MORE平滑滤镜(阀值更大)
ImageFilter.SHARPEN锐化滤镜

2.1滤镜效果图

原图

模糊-ImageFilter.BLUR

轮廓(铅笔画)-ImageFilter.CONTOUR

边界加强-ImageFilter.EDGE_ENHANCE

边界加强(阀值更大)-ImageFilter.EDGE_ENHANCE_MORE

浮雕-ImageFilter.EMBOSS

边界-ImageFilter.FIND_EDGES(其实相当于背景涂黑,线条白色)

平滑-ImageFilter.SMOOTH

平滑(阀值更大)-ImageFilter.SMOOTH_MORE

锐化-ImageFilter.SHARPEN

2.2 自定义滤镜

class SELF_FILTER(ImageFilter.BuiltinFilter):
    name = "SELF_FILTER"
    filterargs=(3,3),2,0,(
    -1,-1,-1,
    -1,9,-1,
    -1,-1,-1,
    )
result = img.filter(SELF_FILTER)
result.show()

效果

3.图像局部切割

# 导包
from PIL import Image

# 加载图片
img = Image.open("./img.jpg")

# 查看图片大小
print(img.size) #(750, 300)

# 设置切割范围 (点1x,点1y,点2x,点2y)
area = (170,80,580,240)

# 切割图片
img_crop = img.crop(area)

# 查看结果
img_crop.show()

切割结果

4.图像粘贴(叠加)

# 导包
from PIL import Image

# 准备图片
img = Image.open("./img.jpg")
area = Image.open("./area.jpg")

# 图片(粘贴)叠加   会直接改变原图,不产生新的图片
# 格式:图片1.paste(图片2,位置)  位置为左上角的(x,y)
img.paste(area,(0,0))

# 查看效果
img.show()

结果

5.图像拼接--通过图像粘贴(叠加)实现

# 导包
from PIL import Image

# 准备图片
img1 = Image.open("./img.jpg")
img2 = Image.open("./img.jpg")

# 创建拼接结果的空白图:new(模式,大小,颜色)
"""
模式:'RGB'/'RGBA'
大小:(width,height)
颜色:(R,G,B)
"""
empty = Image.new('RGB',(750,600),(255,255,255))

# 通过图像粘贴(叠加)实现图片拼接
empty.paste(img1,(0,0))
empty.paste(img2,(0,300))

# 查看效果
empty.show()

结果

6.图片缩放--会按比例缩放,不会拉伸

# 导包
from PIL import Image

# 准备图片
img = Image.open("./img.jpg")
print(img.size) #(750, 300)

# 缩放 -- 直接修改原图,不产生新图
new_size = (375,150)
img.thumbnail(new_size)
print(img.size) #(375, 150)

# 查看效果
img.show()

结果

(750, 300)
(375, 150)

7.镜像翻转

7.1 左右镜像

# 导包
from PIL import Image

# 准备图片
img = Image.open("./img.jpg")

# 左右镜像
img_lr = img.transpose(Image.FLIP_LEFT_RIGHT)

# 查看效果
img_lr

原图:

原图

镜像图

7.2 上下镜像

# 导包
from PIL import Image

# 准备图片
img = Image.open("./img.jpg")

# 上下镜像
img_tb = img.transpose(Image.FLIP_TOP_BOTTOM)

# 查看效果
img_tb

镜像图

8. 文字水印-把文字写到图上

# 导包
from PIL import Image,ImageFont,ImageDraw

# 准备图片
img = Image.open("./img.jpg")

# 创建字体对象
# ImageFont.truetype(字体文件,字号)  笔
font = ImageFont.truetype('./BOD_B.TTF',60)

# 创建draw对象 纸
draw = ImageDraw.Draw(img)

# 文字渲染 
# draw.text(坐标,文字内容,font = 字体对象,fill = 文字颜色)
draw.text((0,0),"Hello World",font = font,fill = (255,0,0))

# 查看效果
img.show()

结果

9. 生成简单的数字验证码

# 导包
from PIL import Image,ImageFont,ImageDraw
import random

# 创建空白图片
img = Image.new('RGB',(120,60),(255,255,255))

# 渲染背景
draw = ImageDraw.Draw(img)
for i in range(0,120):
    for j in range(0,60):
        r = random.randint(60,255)
        g = random.randint(60,255)
        b = random.randint(60,255)
        draw.point((i,j),(r,g,b))
        
# 背景模糊
img = img.filter(ImageFilter.BLUR)

# 渲染文字
draw = ImageDraw.Draw(img)
font = ImageFont.truetype('./BOD_B.TTF',40)
draw.text((20,10),"2345",font = font,fill = (0,0,0))

# 查看效果
img.show()

简单数字验证码

参考资料

  1. python pil 第三方库实战之三:ImageFilter滤镜小试:https://blog.csdn.net/kanwenzhang/article/details/51936742
  2. PIL告诉你这么处理图片让你不再加班处理图片:https://www.bilibili.com/video/BV1yE411L7dR?p=11&spm_id_from=pageDriver
0

评论 (0)

打卡
取消