使用 Python 生成方形或圆形缩略图 - Pillow
缩略图通常用于各种应用程序中,以紧凑且具有视觉吸引力的方式呈现照片。它们使用户能够快速轻松地浏览大量照片,因为它们是紧凑的压缩图像,可以忠实地描绘原始图像。
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 库导入必要的模块:Image 和 ImageDraw。
使用 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 应用程序、社交网络平台和照片库创建具有视觉吸引力的缩略图。