原文: http://zetcode.com/python/pillow/

Pillow 教程展示了如何在 Python 中使用 Pillow 来处理图像。 来源可从作者的 Github 仓库中获得。

Pillow

Pillow 是 Python 图像库(PIL),它增加了对打开,操作和保存图像的支持。 当前版本标识并读取大量格式。 有意将写支持限制为最常用的交换和表示格式。

显示图片

在第一个示例中,我们读取图像文件并在外部程序中显示它。

show_image.py

  1. #!/usr/bin/python3
  2. from PIL import Image
  3. import sys
  4. try:
  5. tatras = Image.open("tatras.jpg")
  6. except IOError:
  7. print("Unable to load image")
  8. sys.exit(1)
  9. tatras.show()

该程序读取 JPG 图像并将其显示在外部应用中。

  1. from PIL import Image

在 PIL 模块中,我们包含Image类。

  1. tatras = Image.open("tatras.jpg")

Image.open()方法读取图像文件。Pillow 可以读取 30 多种不同的文件格式。

  1. tatras.show()

show()方法主要用于调试目的。 它将图像保存到一个临时文件中并在外部程序中显示。 在 Linux 上可以是 ImageMagic,在 Windows 上可以是 Paint。

Pillow 的基本图像信息

Pillow 使我们可以获得有关图像的一些基本信息。

basic_info.py

  1. #!/usr/bin/python3
  2. from PIL import Image
  3. import sys
  4. try:
  5. tatras = Image.open("tatras.jpg")
  6. except IOError:
  7. print("Unable to load image")
  8. sys.exit(1)
  9. print("Format: {0}\nSize: {1}\nMode: {2}".format(tatras.format,
  10. tatras.size, tatras.mode))

该示例使用 Pillow 打印有关图像的基本信息。

  1. print("Format: {0}\nSize: {1}\nMode: {2}".format(tatras.format,
  2. tatras.size, tatras.mode))

我们打印图像格式,大小和模式。

  1. $ ./basic_info.py
  2. Format: JPEG
  3. Size: (350, 232)
  4. Mode: RGB

这是程序的输出。

图像模糊

ImageFilter模块包含一组预定义的过滤器的定义,可以与filter()方法一起使用。

blur_image.py

  1. #!/usr/bin/python3
  2. from PIL import Image, ImageFilter
  3. import sys
  4. try:
  5. img = Image.open("tatras.jpg")
  6. except IOError:
  7. print("Unable to load image")
  8. sys.exit(1)
  9. blurred = img.filter(ImageFilter.BLUR)
  10. blurred.save("blurred.png")

该程序加载图像,从原始图像创建模糊图像,然后将新图像保存在磁盘上。

  1. from PIL import Image, ImageFilter

我们导入ImageImageFilter模块。

  1. blurred = img.filter(ImageFilter.BLUR)

我们将ImageFilter.BLUR应用于原始图像; 该操作将返回一个新的修改图像。

  1. blurred.save("blurred.png")

使用save()方法,我们将模糊的图像保存在磁盘上。

用 Pillow 转换图像

使用save()方法,我们可以将图像转换为其他格式。

convert2png.py

  1. #!/usr/bin/python3
  2. from PIL import Image
  3. import sys
  4. try:
  5. tatras = Image.open("tatras.jpg")
  6. except IOError:
  7. print("Unable to load image")
  8. sys.exit(1)
  9. tatras.save('tatras.png', 'png')

该程序读取 JPG 图像并将其转换为 PNG 格式。

  1. tatras.save('tatras.png', 'png')

save()方法的第二个参数指定图像格式。

灰度图像

使用Image.convert()方法,我们可以产生黑白图像。

grayscale.py

  1. #!/usr/bin/python3
  2. from PIL import Image
  3. import sys
  4. try:
  5. tatras = Image.open("tatras.jpg")
  6. except IOError:
  7. print("Unable to load image")
  8. sys.exit(1)
  9. grayscale = tatras.convert('L')
  10. grayscale.show()

该程序读取图像并将其转换为灰度图像。

  1. grayscale = tatras.convert('L')

convert()方法的第一个参数是mode"L"模式是黑白的。

用 Pillow 裁剪图像

Image.crop()裁剪图像。

crop_image.py

  1. #!/usr/bin/python3
  2. from PIL import Image
  3. import sys
  4. try:
  5. tatras = Image.open("tatras.jpg")
  6. except IOError:
  7. print("Unable to load image")
  8. sys.exit(1)
  9. cropped = tatras.crop((100, 100, 350, 350))
  10. cropped.save('tatras_cropped.jpg')

该程序将裁剪图像。 裁剪后的图像保存在磁盘上。

  1. cropped = tatras.crop((100, 100, 350, 350))

crop()方法采用 4 个元组来定义左,上,右和下像素坐标。

用 Pillow 旋转图像

Image.rotate()返回图像的旋转副本。

rotate_image.py

  1. #!/usr/bin/python3
  2. from PIL import Image
  3. import sys
  4. try:
  5. tatras = Image.open("tatras.jpg")
  6. except IOError:
  7. print("Unable to load image")
  8. sys.exit(1)
  9. rotated = tatras.rotate(180)
  10. rotated.save('tatras_rotated.jpg')

该程序将图像旋转 180 度并将新创建的图像保存在磁盘上。

在 Tkinter 中显示图像

以下程序在 Tkinter 程序中显示图像。

show_tkinter.py

  1. #!/usr/bin/python3
  2. # -*- coding: utf-8 -*-
  3. from PIL import Image, ImageTk
  4. from tkinter import Tk
  5. from tkinter.ttk import Frame, Label
  6. import sys
  7. class Example(Frame):
  8. def __init__(self):
  9. super().__init__()
  10. self.loadImage()
  11. self.initUI()
  12. def loadImage(self):
  13. try:
  14. self.img = Image.open("tatrs.jpg")
  15. except IOError:
  16. print("Unable to load image")
  17. sys.exit(1)
  18. def initUI(self):
  19. self.master.title("Label")
  20. tatras = ImageTk.PhotoImage(self.img)
  21. label = Label(self, image=tatras)
  22. # reference must be stored
  23. label.image = tatras
  24. label.pack()
  25. self.pack()
  26. def setGeometry(self):
  27. w, h = self.img.size
  28. self.master.geometry(("%dx%d+300+300") % (w, h))
  29. def main():
  30. root = Tk()
  31. ex = Example()
  32. ex.setGeometry()
  33. root.mainloop()
  34. if __name__ == '__main__':
  35. main()

该程序在 Tkinter 工具箱的Label小部件中显示图像。

  1. from PIL import Image, ImageTk

ImageTk是 Tkinter 兼容的照片图像。 它可以在 Tkinter 需要图像对象的任何地方使用。

  1. tatras = ImageTk.PhotoImage(self.img)

我们创建照片图像。

  1. label = Label(self, image=tatras)

将照片图像提供给标签窗口小部件的image参数。

  1. label.image = tatras

为了不被垃圾收集,必须存储图像引用。

  1. w, h = self.img.size
  2. self.master.geometry(("%dx%d+300+300") % (w, h))

窗口的大小适合图像大小。

从 URL 读取图像

下一个示例从 URL 读取图像。

read_from_url.py

  1. #!/usr/bin/python3
  2. from PIL import Image
  3. import requests
  4. import sys
  5. url = 'https://i.ytimg.com/vi/vEYsdh6uiS4/maxresdefault.jpg'
  6. try:
  7. resp = requests.get(url, stream=True).raw
  8. except requests.exceptions.RequestException as e:
  9. sys.exit(1)
  10. try:
  11. img = Image.open(resp)
  12. except IOError:
  13. print("Unable to open image")
  14. sys.exit(1)
  15. img.save('sid.jpg', 'jpeg')

该示例从 URL 读取图像并将其保存在磁盘上。

  1. import requests

我们使用requests库下载图像。

  1. resp = requests.get(url, stream=True).raw

我们将图像读取为原始数据。

  1. img = Image.open(resp)

Image是从响应对象创建的。

  1. img.save('sid.jpg', 'jpeg')

图像被保存。

Pillow 绘制图像

Pillow 具有一些基本的 2D 图形功能。 ImageDraw模块为Image对象提供简单的 2D 图形。 我们可以创建新图像,注释或修饰现有图像,以及即时生成图形以供 Web 使用。

draw2image.py

  1. #!/usr/bin/python3
  2. from PIL import Image, ImageDraw
  3. img = Image.new('RGBA', (200, 200), 'white')
  4. idraw = ImageDraw.Draw(img)
  5. idraw.rectangle((10, 10, 100, 100), fill='blue')
  6. img.save('rectangle.png')

该示例创建一个新图像,并在图像上绘制一个蓝色矩形。

  1. img = Image.new('RGBA', (200, 200), 'white')

创建一个新的Image。 图像模式为"RGBA"。 大小为200x200,背景为白色。

  1. idraw = ImageDraw.Draw(img)

根据图像,我们创建ImageDraw对象。 现在我们可以在图像上执行一些绘制操作。

  1. idraw.rectangle((10, 10, 100, 100), fill='blue')

使用rectangle()方法,我们在图像上绘制了一个蓝色矩形。

用 Pillow 创建水印

以下示例创建一个水印。

watermark.py

  1. #!/usr/bin/python3
  2. from PIL import Image, ImageDraw, ImageFont
  3. import sys
  4. try:
  5. tatras = Image.open("tatras.jpg")
  6. except:
  7. print("Unable to load image")
  8. sys.exit(1)
  9. idraw = ImageDraw.Draw(tatras)
  10. text = "High Tatras"
  11. font = ImageFont.truetype("arial.ttf", size=18)
  12. idraw.text((10, 10), text, font=font)
  13. tatras.save('tatras_watermarked.png')

我们使用ImageDraw模块创建水印。

  1. font = ImageFont.truetype("arial.ttf", size=18)

我们创建 18 大小的 Arial 字体。

  1. idraw.text((10, 10), text, font=font)

水印是通过text()方法创建的。 文本的默认颜色是白色。 我们使用创建的字体。

Pillow 教程 - 图1

图:High Tatras

在本教程中,我们使用了 Python Pillow 库。

您可能也对以下相关教程感兴趣: Tkinter 教程Matplotlib 教程Python Arrow 教程PyQt5 教程和[ Python 教程