使用 Python 生成方形或圆形缩略图 - Pillow

pythonserver side programmingprogramming

缩略图通常用于各种应用程序中,以紧凑且具有视觉吸引力的方式呈现照片。它们使用户能够快速轻松地浏览大量照片,因为它们是紧凑的压缩图像,可以忠实地描绘原始图像。

Python 在图像操作和处理方面很受欢迎。用于处理图像的著名 Python 库是 Python 图像库 (PIL),现在称为 Pillow,它提供了大量工具来执行各种图像处理操作,例如裁剪、调整大小和应用滤镜。

方法

  • 生成方形缩略图

  • 生成圆形缩略图

  • 使用 ImageOps.fit() 生成圆形缩略图

先决条件

在继续之前,我们必须安装一些 Python 库,我们将使用以下命令安装 Pillow 和 numpy 库:

pip install pillow
pip install numpy

在查看生成方形或圆形缩略图的方法之前,我们首先需要知道如何使用 Python 中的 Pillow 库打开缩略图。我们来举个例子:

示例

# 导入所需的库
from PIL import Image

# 打开图像
image=Image.open('spiderman.jpg')

# 调整图像大小
img.thumbnail((width, height))

# 保存缩略图
img.save('thumbnail_image.jpg')

# 使用 show() 函数显示图像
image.show()

输出

我们已使用上述代码成功打开缩略图。

方法 1:生成方形缩略图

算法

  • 从 Pillow 库中导入必要的模块:Image。

  • 使用 Image.open() 方法加载原始图像。

  • 使用 size 属性确定原始图像的尺寸。

  • 通过将宽度除以高度,确定原始图像的纵横比。

  • 将所需的宽度或高度(以较小者为准)设置为正方形的边长,以确定缩略图的大小。

  • 计算要裁剪的原始图像区域的大小。如果原始图像的宽高比大于 1(即,宽度大于高度),则裁剪图像的顶部和底部,使其高度与缩略图的宽度相同。 如果宽高比小于 1(即,高度大于宽度),则裁剪图像的两侧,使其宽度与缩略图的高度相同。

  • 要裁剪原始图像的一部分,请使用 crop() 方法。

  • 使用 thumbnail() 方法将裁剪后的图像调整为所需大小。

  • 使用 save() 方法保存方形缩略图。

步骤 1:- 从 PIL(Python 图像库)包导入图像模块。

from PIL import Image

步骤 2:- 打开原始图像文件。

img = Image.open('spiderman.jpg')

步骤 3:- 调整图像大小,同时保持纵横比。

img.thumbnail((2000, 2000))

步骤 4:- 确定调整大小后图像的尺寸。

width, height = img.size

步骤 5:- 计算要裁剪的区域的坐标,以实现正方形,同时保留原始图像的中心。如果原始图像的宽度大于其高度,则裁剪图像的左侧和右侧。否则,裁剪图像的顶部和底部。crop() 方法获取要裁剪区域的左侧、顶部、右侧和底部坐标,因此我们可以计算这些值。

if width > height:
   left = (width - height) / 2
   right = (width + height) / 2
   top = 0
   bottom = height
else:
   left = 0
   right = width
   top = (height - width) / 2
   bottom = (height + width) / 2

步骤 6:- 使用上面计算出的坐标裁剪图像以获得正方形。

img = img.crop((left, top, right, bottom))

步骤 7:- 将正方形缩略图保存到文件中。

img.save('square_thumbnail.jpg')

步骤 8:- 使用 show() 方法显示图像。

img.show()

示例

# 导入所需的库
from PIL import Image

# 打开图像文件
img = Image.open('spiderman.jpg')

# 调整图像大小
img.thumbnail((2000, 2000))

# 将图像裁剪为正方形
width, height = img.size
if width > height:
   left = (width - height) / 2
   right = (width + height) / 2
   top = 0
   bottom = height
else:
   left = 0
   right = width
   top = (height - width) / 2
   bottom = (height + width) / 2
img = img.crop((left, top, right, bottom))

# 保存方形缩略图
img.save('square_thumbnail.jpg')

# 使用 show() 函数显示图像
img.show()

输出

方法 2- 生成圆形缩略图

在此,我们将学习如何创建圆形缩略图,我们可以先调整原始图像的大小,然后创建一个与缩略图大小相同的圆形蒙版,并将调整大小的图像粘贴到蒙版上。为此,我们将使用以下算法:

  • 从 Pillow 库导入必要的模块:ImageImageDraw

  • 使用 Image.open() 方法加载原始图像。

  • 使用 size 属性确定原始图像的尺寸。

  • 使用 ImageDraw.Draw() 方法从蒙版图像创建新对象。

  • 使用 draw.ellipse() 方法在蒙版图像上绘制一个椭圆。将图像置于椭圆的中心。

  • 使用 Image.new() 方法创建一个与原始图像尺寸相同且背景透明的新图像。

  • 使用 paste() 方法将原始图像粘贴到新图像上,并为新图像提供圆形边缘。

  • 使用 save() 方法保存方形缩略图。

步骤 1:- 从 Pillow 库导入必要的模块:Image 和 ImageDraw。

from PIL import Image, ImageDraw

步骤 2:- 使用 open() 方法打开图像并将其保存在变量中。

img = Image.open('spiderman.jpg')

步骤 3:- 使用 thumbnail() 方法调整图像大小。

img.thumbnail((2000, 2000))

步骤 4:- 使用 Image.new() 创建与原始图像尺寸相同的新灰度图像方法。

mask = Image.new('L', img.size, 0)

步骤 5:- 使用 ImageDraw.Draw() 方法从掩码图像创建一个新对象。

draw = ImageDraw.Draw(mask)

步骤 6:- 使用 draw.ellipse() 方法在掩码图像上绘制一个椭圆。椭圆应位于图像的中心。

draw.ellipse((0, 0, img.size[0], img.size[1]), fill=255)

步骤 7:- 使用 Image.new() 方法从原始图像生成新图像。

result = Image.new('RGBA', img.size, (255, 255, 255, 0))

步骤 8:- 使用 paste() 方法将原始图像粘贴到新图像上。使用 mask 参数作为透明度蒙版,使图像的边缘呈圆形。

result.paste(img, (0, 0), mask)

步骤 9:- 使用 save() 方法将生成的图像保存为 PNG 文件。

result.save('circular_thumbnail.png')

步骤 10:- 使用 show() 方法显示生成的图像。

result.show()

示例

# 导入所需库
从 PIL 导入 Image、ImageDraw

# 打开图像文件
img = Image.open('sipderman.jpg')

# 调整图像大小
img.thumbnail((2000, 2000))

# 创建圆形蒙版
mask = Image.new('L', img.size, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0, img.size[0], img.size[1]), fill=255)

# 将蒙版应用于图像
result = Image.new('RGBA', img.size, (255, 255, 255, 0))
result.paste(img, (0, 0), mask)

# 保存圆形缩略图图像
result.save('circular_thumbnail.png')

# 使用 show() 函数显示图像
result.show()

输出

方法 3:使用 ImageOps.fit() 生成圆形缩略图

在此,我们将学习如何使用 ImageOps 创建圆形缩略图。为此,我们将使用以下算法:

  • 从 Pillow 库导入必要的模块:Image、ImageOps 和 ImageDraw。

  • 使用 Image.open() 方法加载原始图像。

  • 使用 ImageOps.fit() 方法将图像调整为所需大小。

  • 使用 Image.new() 方法为圆形蒙版创建新图像。将新图像的模式设置为"L",代表灰度。

  • 创建一个新的 ImageDraw.Draw() 对象,并使用 draw.ellipse() 方法在圆形蒙版上绘制椭圆

  • 使用 img.putalpha() 方法将圆形蒙版应用于调整大小的图像。此方法将图像的 alpha 通道设置为蒙版图像,使椭圆外的所有像素完全透明。

  • 使用 save() 方法保存方形缩略图。

步骤 1:- 导入必要的库

from PIL import Image, ImageOps, ImageDraw

步骤 2:- 从文件路径打开图像文件

img = Image.open('spiderman.jpg')

步骤 3:- 使用 ImageOps.fit() 方法调整图像大小。

img = ImageOps.fit(img, (300, 300))

步骤 4:- 创建一个您想要的圆形蒙版并用黑色填充它

mask = Image.new('L', (300, 300), 0)

步骤 5:- 为遮罩创建一个 Draw 对象,并绘制一个白色椭圆来填充圆形

draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0, 300, 300), fill=255)

步骤 6:- 使用 putalpha() 方法将遮罩应用于原始图像,该方法根据遮罩设置每个像素的 alpha 通道。

img.putalpha(mask)

步骤 7:- 使用 save() 方法将生成的图像保存为 PNG 文件。

img.save('circular_thumbnail.png')

步骤 8:- 使用 show() 方法显示生成的图像。

img.show()

示例

# 导入所需库
从 PIL 导入 Image、ImageOps、ImageDraw

# 打开图像文件
img = Image.open('spiderman.jpg')

# 将图像大小调整为正方形
img = ImageOps.fit(img, (300, 300))

# 创建圆形蒙版
mask = Image.new('L', (300, 300), 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0, 300, 300), fill=255)

# 将蒙版应用于图像
img.putalpha(mask)

# 保存圆形缩略图
img.save('circular_thumbnail.png')

# 使用 show() 显示图像函数
img.show()

输出

结论

在本文中,我们研究了使用 Pillow 创建方形或圆形缩略图的三种不同方法。每种策略都有优点和缺点,最佳策略将取决于您的应用程序的特定需求。通过采用这些策略,您可以快速为您的 Web 应用程序、社交网络平台和照片库创建具有视觉吸引力的缩略图。


相关文章