Python使用pillow库(PIL库)的使用介绍

python之pillow是 Python 的第三方图像处理库。pillow是PIL( Python Imaging Library)基础上发展起来的,发展至今,pillow已经成为了比 PIL 更具活力的图像处理库。Pillow 的初衷只是想作为 PIL 库的分支和补充,如今它已是“青出于蓝而胜于蓝”。Pillow是一个Python图像处理库,提供了丰富的图像处理功能,包括图片打开、大小调整、裁剪、旋转、滤镜等操作。

pillow中文文档 Pillow — Pillow (PIL Fork) 8.4.0 文档

pillow库的安装

pip install pillow

【Python第三方模块(库、包)安装、卸载与查看及常见问题解决,可参见https://blog.csdn.net/cnds123/article/details/104393385】

需要注意的是pillow库安装成功后,导包时要用PIL来导入,而不是用pillow【这里使用 PIL 导入,但实际上使用的是 Pillow 库,这里的 PIL 可以看做是 Pillow 库的简称】。如:

import PIL

from PIL import Image

打开图片保存图片的基本操作:

# 打开图片

img = Image.open("d:\\image\\tp.jpg")

# 显示图片(执行显示图片后线程会中断,关闭图像后恢复)

img.show()

# 保存图片

img.save(""d:\\image\\tp2.jpg")

Python实现图片添加文字(水印)

PIL.ImageFont.truetype()函数从给定文件中加载字体对象,并为给定大小的字体创建一个字体对象。

下面给出示例代码(所用图片见附录):

from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw
imageFile = "图.jpg"
img=Image.open(imageFile)
draw = ImageDraw.Draw(img)
ft = ImageFont.truetype("C:\\WINDOWS\\Fonts\\SIMYOU.TTF", 20)
draw.text((30,30), u"测试文字",font = ft, fill = 'red')
ft = ImageFont.truetype("C:\\WINDOWS\\Fonts\\SIMYOU.TTF", 40)
draw.text((30,80), u"测试文字",font = ft, fill = 'green')
ft = ImageFont.truetype("C:\\WINDOWS\\Fonts\\SIMYOU.TTF", 60)
draw.text((30,150), u"测试文字",font = ft, fill = 'blue')
ft = ImageFont.truetype("C:\\WINDOWS\\Fonts\\SIMLI.TTF", 40)
draw.text((30,220), u"测试文字",font = ft, fill = 'red')
ft = ImageFont.truetype("C:\\WINDOWS\\Fonts\\STXINGKA.TTF", 40)
draw.text((30,300), u"测试文字",font = ft, fill = 'purple')
img.show() #显示
img.save("图2.png") # 保存

运行效果:

 Python往图片覆盖另一张图片

paste函数的作用为将一张图片覆盖到另一张图片的指定位置去,第一个参数指定要进行复制的图像,第二个参数为二元或四元数组,用于指定粘贴位置的左上角坐标(和右下角坐标)。第三个作为可选参数mask可选范围0-255,0表示透明粘贴,mask值越大粘贴透明度越低,255为不透明粘贴。

下面给出示例代码(所用图片见附录):

from PIL import Image
from PIL import ImageDraw
img2 = Image.open("小图.jpg")
img1 = Image.open("图.jpg")
img1.paste(img2, (200, 100))  # 纵向拼接
img1.show() #显示
img1.save("图.jpg") # 保存

运行效果:

图片旋转

示例源码如下:

from PIL import Image
img = Image.open("汽车.jpg") #打开图片
img2 = img.rotate(45,expand=True) #旋转,参数expand=True保证旋转后的图像完整显示
img2.show() #显示

运行效果:

滤镜功能

示例源码如下:

from PIL import Image
from PIL import ImageFilter
img = Image.open("汽车.jpg")
img = img.filter(ImageFilter.CONTOUR)
img.show()

运行效果:

图片缩放

示例源码如下:

from PIL import Image
img = Image.open('汽车.jpg')
w, h = img.size # 获得图像尺寸 
img.thumbnail((w//2, h//2)) #缩放到50%:
img.show() #显示

运行效果:

选择图片剪裁及保存

以下是一个简单的示例代码,实现了将一张图片在GUI中显示,并且可以通过鼠标拖拽来选取需要剪裁的区域,并将剪裁后的结果保存为新的图片文件。

from tkinter import *
from tkinter import filedialog
from PIL import Image, ImageTk

class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.canvas = Canvas(self, width=500, height=500, bd=1, relief=SOLID)
        self.canvas.pack()

        self.select_button = Button(self, text="选择图片", command=self.select_image)
        self.select_button.pack(side="left")

        self.crop_button = Button(self, text="剪裁", state=DISABLED, command=self.crop_image)
        self.crop_button.pack(side="left")

        self.save_button = Button(self, text="保存", state=DISABLED, command=self.save_image)
        self.save_button.pack(side="left")

        self.canvas.bind("<ButtonPress-1>", self.start_crop)
        self.canvas.bind("<B1-Motion>", self.draw_crop_rect)
        self.canvas.bind("<ButtonRelease-1>", self.end_crop)

        self.rect = None
        self.start_x = None
        self.start_y = None
        self.end_x = None
        self.end_y = None

    def select_image(self):
        filename = filedialog.askopenfilename(initialdir="/", title="Select file",
                                              filetypes=(("png files", "*.png"), ("jpg files", "*.jpg")))
        if filename:
            self.filename = filename
            image = Image.open(filename)
            self.image = ImageTk.PhotoImage(image)
            self.canvas.create_image(0, 0, image=self.image, anchor="nw")
            self.crop_button.config(state=NORMAL)

    def start_crop(self, event):
        self.start_x = event.x
        self.start_y = event.y

    def draw_crop_rect(self, event):
        if self.rect:
            self.canvas.delete(self.rect)
        self.end_x = event.x
        self.end_y = event.y
        self.rect = self.canvas.create_rectangle(self.start_x, self.start_y, self.end_x, self.end_y, fill="", outline="red")

    def end_crop(self, event):
        self.crop_button.config(state=NORMAL)
        self.save_button.config(state=NORMAL)

    def crop_image(self):
        box = (self.start_x, self.start_y, self.end_x, self.end_y)
        image = Image.open(self.filename)
        cropped_image = image.crop(box)
        self.cropped_image = cropped_image
        self.crop_button.config(state=DISABLED)

    def save_image(self):
        filename = filedialog.asksaveasfilename(initialdir="/", title="Save as",
                                                filetypes=(("png files", "*.png"), ("jpg files", "*.jpg")))
        if filename:
            self.cropped_image.save(filename)

root = Tk()
app = Application(master=root)
app.mainloop()

运行效果:

小结一下:

Pillow是一个PIL(Python Imaging Library)库的替代品,提供了对更多图像格式的支持和更新的功能。因此,我们推荐安装Pillow库来代替PIL库。
Pillow是一个Python图像处理库,提供了丰富的图像处理功能,包括图片打开、大小调整、裁剪、旋转、滤镜等操作。需要提醒的是使用Pillow库,安装名用Pillow,命令行中运行以下命令:
pip install Pillow
导入用名称为 PIL,例如
导入整个Pillow库:
import PIL
将Image和ImageTk模块从Pillow库导入:
from PIL import Image, ImageTk

附录

素材图片如下:

 OK

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐