使用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 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告