📜  用Python生成方形或圆形缩略图 – Pillow

📅  最后修改于: 2022-05-13 01:54:37.088000             🧑  作者: Mango

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

先决条件:枕头,麻木

在“THUMBNAIL”这个词中,THUMB 的意思是短。缩略图是原始图像的压缩预览图像,或者缩略图是图像的较小版本。简而言之,缩略图是代表较大/原始图像的较小图像。

通常,缩略图的形状取决于原始图像,但在本文中,我们将使用Python的Pillow 库生成圆形和方形缩略图。

安装:

要安装枕头和 NumPy 库,请在命令提示符下编写以下命令。



pip install pillow
pip install numpy

示例 1:使用 Pillow 库打开图像。

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


Python
# 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')


Python
# 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')


输出:

示例 2:使用 Pillow Library 生成圆形缩略图图像。

方法:

  • 使用 NumPy 库将图像转换为 NumPy 数组。
  • 现在使用PIL.Image.new()函数通过传递模式、图像大小和颜色创建一个新的蒙版图像,然后使用PIL.Image.Draw.Draw()函数通过传递新蒙版图像的大小来绘制图像并将其存储在名为“draw”的变量中。
  • 通过传递四个点来定义边界,使用ImageDraw.Draw.peislice()函数在蒙版图像上制作圆圈,起始角度 = 0,结束角度 = 360 这将在蒙版图像上创建圆圈,并通过它们传递填充参数进行填充图像中的颜色。
  • 将掩码图像转换为 numpy 数组,然后使用numpy.dstack()函数将数组与第三个轴深度堆叠,并传递我们在上述步骤中转换的原始图像数组和掩码图像数组以获得圆形图像,和让它存储在名为“npImage”的变量中。
  • 由于这个“npImage”是数组格式,我们必须将这个数组转换为图像,这是在PIL.Image.fromarray()函数的帮助下完成的作为“final_image”。
  • 因为我们已经生成了圆形图像。

下面是完整的实现:

Python



# 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 Library 生成方形缩略图图像。

方法:

  • 如果图像的尺寸属于后两个条件中的任何一个,请检查 height==width 或 height>width 或 width>height 的三个条件。
  • 然后我们必须使用具有图像最长边/尺寸的 new()函数创建新的蒙版图像。
  • 然后使用 paste()函数将原始图像粘贴到新的蒙版图像上,并传递具有计算尺寸的原始图像,我们将在示例的解释中讨论。
  • 现在我们将按照上述步骤得到方形图像。
  • 现在我们必须生成缩略图图像,我们可以通过使用 PIL.Image.thumbnail() 方法通过将大小作为参数传递来完成此操作,然后使用 PIL.Image.save() 方法保存它并传递图像的名称具有标准图像格式。

下面是完整的实现:

Python

# 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')

输出:

说明:我们已经创建了函数通过将图像生成一个正方形图像,它的宽度和高度作为参数。在函数中,我们在生成方形图像的基础上检查了三个条件。

  • 在第一个条件中,我们检查了图像的高度是否等于宽度,如果为 True,那么我们将返回图像原样,因为当高度和宽度相等时,图像已经是正方形。
  • 在第二种情况下,如果图像的高度大于宽度,那么我们使用 Image.new()函数通过传递图像的模式和大小作为高度(即高度,高度)来创建新的蒙版图像) 并使用 paste()函数通过传递原始图像和原始图像粘贴在蒙版图像上的尺寸将原始图像粘贴到创建的蒙版图像上,即从计算的尺寸(减去原始图像的高度与原始图像的宽度)然后将其除以2)除以0,这样原始图像就可以完美地粘贴在蒙版图像上。
  • 在第三个条件中,如果图像的宽度大于高度,那么我们执行与第二个条件相同的过程,但唯一的变化是我们创建了大小为宽度的遮罩图像(即,宽度,宽度),在粘贴的情况下,我们必须传递原始图像和尺寸,即从 0 到计算的尺寸(通过用原始图像的高度减去原始图像的宽度,然后将其除以 2)以便原始图像可以完美地粘贴在蒙版图像上。