用Python Pillow生成方形或圆形的缩略图
在 “THUMBNAIL “这个词中,THUMB的意思是短。缩略图是原始图像的压缩预览图像,或缩略图是图像的缩小版。简单地说,缩略图是代表较大/原始图像的较小图像。
通常,缩略图的形状取决于原始图像,但在这篇文章中,我们将使用Python中的Pillow库生成圆形和方形的缩略图。
安装:
对于安装pillow和NumPy库,在你的命令提示符上写下以下命令。
pip install pillow
pip install numpy
例子1。使用Pillow Library打开图像。
# importing necessary libraries
from PIL import Image
# opening the image from the storage using
# Image.open() function
orig_img=Image.open('Geekwork/sebastian-molina.jpg')
# showing the image using show() function
orig_img.show()
输出:
实例2:使用Pillow库生成圆形缩略图。
步骤:
- 使用NumPy库将图像转换成NumPy数组。
- 现在使用PIL.Image.new()函数通过传递模式、图像大小和颜色创建一个新的遮罩图像,然后使用PIL.Image.Draw.Draw()函数通过传递新遮罩图像的大小来绘制图像,并让其存储在名为 “draw “的变量中。
- 使用ImageDraw.Draw.peislice()函数在遮罩图像上制作圆圈,通过传递四个点来定义边界,起始角度=0,结束角度=360,这就在遮罩图像上创建了圆圈,并通过它们传递填充参数来填充图像中的颜色。
- 将遮罩图像转换为numpy数组,然后使用numpy.dstack()函数将数组按深度堆叠,并将原始图像数组和我们在上述步骤中转换的遮罩图像数组传递给我们,以获得圆形图像,并让它存储在名为 “npImage “的变量中。
- 由于 “npImage “是数组格式,我们必须将这个数组转换为图像,这是在PIL.Image.fromarray()函数的帮助下完成的,该函数将npImage作为一个参数,让它存储在名为 “final_image “的变量中。
- 由于我们已经生成了圆形图像。
以下是完整的实现方案:
# importing necessary libraries
from PIL import Image, ImageDraw
import numpy as np
# opening the image from
# the storage using Image.open() function
orig_img=Image.open('sebastian-molina.jpg')
# getting height and width of
# an image using size() function
height,width=orig_img.size
# converting image to numpy array
npImage=np.array(orig_img)
# Creating mask image in L mode with same image size
new_img = Image.new('L', orig_img.size,0)
# drawing on mask created image using Draw() function
draw = ImageDraw.Draw(new_img)
# making circle on mask image using pieslice() function
draw.pieslice([0,0,height,width],0,360,fill=255)
# Converting the mask Image to numpy array
np_new=np.array(new_img)
# stack the array sequence
# (original image array with mask image) depth wise
npImage=np.dstack((npImage,np_new))
# converting array to an image using fromarray() function
final_img = Image.fromarray(npImage)
# making thumbnail using thumbnail()
# function by passing the size in it
final_img.thumbnail((500,500))
# saving the circular thumbnail Image
final_img.save('Circular_thumbnail.png')
输出:
实例3:使用Pillow库生成方形缩略图。
步骤:
- 检查三个条件,如果height==width或height>width或width>height,如果图像的尺寸落在后两个条件中的任何一个。
- 然后,我们必须使用new()函数创建新的遮罩图像,并使用图像的最长边/尺寸。
- 然后使用paste()函数将原始图像粘贴到新的遮罩图像上,并将计算好的原始图像传给我们,我们将在例子的解释中讨论这个尺寸。
- 现在我们将通过上述步骤得到方形图像。
- 现在我们必须生成缩略图,我们可以通过使用PIL.Image.thumbnail()方法,将大小作为一个参数传入,然后使用PIL.Image.save()方法保存,并传入标准图像格式的图像名称。
以下是完整的实现方案:
# importing necessary libraries
from PIL import Image, ImageDraw
import numpy as np
# function to generate squared image
def square_thumb(thum_img,width,height):
# checking if height and width are
# are equal then return image as it is
if height == width:
return thum_img
# checking if height is greater than width
elif height > width:
# creating the new mask image of size i,e height of Image
square_img = Image.new(thum_img.mode, (height, height))
# pasting the original image on mask image
# using paste() function to make it square
square_img.paste(thum_img, ((height - width) // 2,0))
# returning the generated square image
return square_img
# if width is greater than height
else:
# creating the new mask image of size i,e width of Image
square_img = Image.new(thum_img.mode, (width, width))
# pasting the original image on mask image using paste()
# function to make it square
square_img.paste(thum_img, (0, (width - height) // 2))
# returning the generated square image
return square_img
# main function
if __name__ == "__main__":
# opening the image from the storage
# using Image.open() function
orig_img=Image.open('sebastian-molina.jpg')
# extracting width and height of an
# image from the image size
w,h = orig_img.size
# calling the function by passing
# image width and height as a parameter
sq_img = square_thumb(orig_img,w,h)
# generating square thumbnail of
# required size using thumbnail() function
sq_img.thumbnail((400,400))
# saving the thumbnail using save function
sq_img.save('Square_thumbnail.jpg')
输出:
解释:我们创建了一个函数,通过传递图像、它的宽度和高度作为参数来生成一个方形图像。在该函数中,我们检查了三个条件,并在此基础上生成了方形图像。
- 在第一个条件中,我们检查了图像的高度是否等于宽度,如果是,那么我们将图像原样返回,因为当高度和宽度相等时,图像已经是方形的了。
- 在第二种情况下,如果图像的高度大于宽度,那么我们使用Image.new()函数创建新的遮罩图像,传递图像的模式和尺寸作为它的高度(即,高度,高度)。在第二种情况下,我们使用Image.new()函数创建新的遮罩图像,并通过原始图像和原始图像粘贴在遮罩图像上的尺寸,即从计算的尺寸(用原始图像的宽度减去原始图像的高度,然后除以2)粘贴原始图像到0,以便原始图像可以完美地粘贴在遮罩图像上。
- 在第三种情况下,如果图像的宽度大于高度,那么我们做了与第二种情况相同的过程,但唯一的变化是我们创建了与它的宽度一样大小的遮罩图像(即,宽度,宽度),在粘贴的情况下,我们必须传递原始图像和尺寸,即从0到计算的尺寸(用原始图像的宽度减去原始图像的高度,然后除以2),以便原始图像可以完美地粘贴到遮罩图像上。