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


缩略图在各种应用中广泛使用,以简洁且具有视觉吸引力的方式呈现照片。它们是紧凑的压缩图像,忠实地再现了原始图像,使用户能够快速轻松地浏览大量照片。

Python 非常流行,可用于图像处理和操作。一个知名的用于处理图像的 Python 库是 Python Imaging Library (PIL),现在称为 Pillow,它提供了许多工具来执行各种图像处理操作,例如裁剪、调整大小和应用滤镜。

方法

  • 生成方形缩略图

  • 生成圆形缩略图

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

先决条件

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

pip install pillow
pip install numpy

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

示例

# importing the required libraries
from PIL import Image

# opening the image
image=Image.open('spiderman.jpg')

# resize image
img.thumbnail((width, height))

# save thumbnail image
img.save('thumbnail_image.jpg')

# showing the image using show() function
image.show()

输出

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

方法一:生成方形缩略图

算法

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

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

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

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

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

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

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

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

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

步骤 1:- 从 PIL(Python Imaging Library)包导入 Image 模块。

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()

示例

# importing the required libraries
from PIL import Image

# open image file
img = Image.open('spiderman.jpg')

# resize image
img.thumbnail((2000, 2000))

# crop image to square shape
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))

# save square thumbnail image
img.save('square_thumbnail.jpg')

# showing the image using show() function
img.show()

输出

方法二- 生成圆形缩略图

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

  • 从 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()

示例

# importing the required libraries
from PIL import Image, ImageDraw 

# open image file
img = Image.open('sipderman.jpg')

# resize image
img.thumbnail((2000, 2000))

# create circular mask
mask = Image.new('L', img.size, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0, img.size[0], img.size[1]), fill=255)

# apply mask to image
result = Image.new('RGBA', img.size, (255, 255, 255, 0))
result.paste(img, (0, 0), mask)

# save circular thumbnail image
result.save('circular_thumbnail.png')

# showing the image using show() function
result.show()

输出

方法三:使用 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()

示例

# importing the required libraries
from PIL import Image, ImageOps, ImageDraw

# open image file
img = Image.open('spiderman.jpg')

# resize image to a square
img = ImageOps.fit(img, (300, 300))

# create circular mask
mask = Image.new('L', (300, 300), 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0, 300, 300), fill=255)

# apply mask to image
img.putalpha(mask)

# save circular thumbnail image
img.save('circular_thumbnail.png')

# showing the image using show() function
img.show()

输出

结论

在本文中,我们介绍了三种使用Pillow创建方形或圆形缩略图图像的不同方法。每种方法都有其优点和缺点,最佳方法将取决于您的应用程序的具体需求。您可以通过使用这些方法快速创建视觉效果良好的缩略图图像,用于您的网络应用程序、社交网络平台和照片库。

更新于:2023年7月19日

816 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告