iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
Software Development

學 Python 到底可以幹麻勒?系列 第 3

( Day 3 ) 批次調整圖片尺寸

  • 分享至 

  • xImage
  •  

這篇文章會介紹使用 Python 的 glob 標準函式庫,搭配 Pillow 第三方函式庫,實作可以將大量的圖片,進行批次調整尺寸的功能。

原文參考:批次調整圖片尺寸

Python 教學 - 批次調整圖片尺寸

安裝 Pillow

輸入下列指令安裝 Pillow,根據個人環境使用 pip 或 pip3,如果使用 Colab 或 Anaconda Jupyter,已經內建 Pillow 函式庫。

!pip install Pillow

使用 size 取得圖片尺寸

透過 Pillow Image 裡的 size 方法,讀取圖片的長寬尺寸,取得的尺寸為 tuple 型別,尺寸的第一個數值為寬度,第二個數值為高度

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用

from PIL import Image
img = Image.open('oxxostudio.jpg')  # 開啟圖片
print(img.size)                     # (1280,720) 印出長寬尺寸

使用 glob 標準函式庫讀取 demo 資料夾裡所有的 jpg 檔案,取得檔案路徑後,就能讀取每一張圖片的長寬尺寸。

相關教學參考:重複迴圈 ( for、while )查找匹配檔案 glob

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用

import glob
from PIL import Image
imgs = glob.glob('./oxxo/*.jpg')     # 取得 demo 資料夾內所有的圖片
for i in imgs:
    im = Image.open(i)    # 依序開啟每一張圖片
    size = im.size        # 取得圖片尺寸
    print(size)

Python 教學 - 批次調整圖片尺寸

使用 resize 調整圖片尺寸

接著使用 Image 的 resize 方法,提供 tuple 型別的長寬數值,就能調整圖片的尺寸。

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用

from PIL import Image
img = Image.open('oxxostudio.jpg')   # 開啟圖片
img2 = img.resize((200,200))         # 調整圖片尺寸為 200x200
img2.save('test.jpg')                # 調整後存檔到 resize 資料夾

搭配 glob,就能一次將所有圖片的尺寸調整為 200x200。

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用

import glob
from PIL import Image
imgs = glob.glob('./oxxo/*.jpg')
for i in imgs:
    im = Image.open(i)
    size = im.size
    name = i.split('/')[::-1][0]        # 取得圖片的名稱
    im2 = im.resize((200, 200))         # 調整圖片尺寸為 200x200
    im2.save(f'./oxxo/resize/{name}')   # 調整後存檔到 resize 資料夾

Python 教學 - 批次調整圖片尺寸

等比例調整圖片尺寸

雖然上方的程式已經可以調整圖片尺寸,但每一張圖片經過調整都變成了單一 200x200 的正方形尺寸 ( 會出現壓扁或拉長現象 ),如果要讓每張圖片等比例縮放,可以先行計算長寬的比例,再根據比例進行調整,執行後就會按照等比例縮放圖片。

相關教學參考:重複迴圈 ( for、while )邏輯判斷 ( if、elif、else )

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用

import glob
from PIL import Image
imgs = glob.glob('./oxxo/*.jpg')
for i in imgs:
    im = Image.open(i)
    size = im.size
    max = 400                    # 設定長或寬最大的數值
    if size[0]>size[1]:          # 如果原始圖片 width 大於 height
        scale = size[1]/size[0]  # 設定 scale 為 height/width
        w = max                  # 設定調整後的寬度為最大的數值
        h = int(max*scale)       # 設定調整後的高度為 max 乘以 scale ( 使用 int 去除小數點 )
    else:                        # 如果原始圖片 width 小於等於 height
        scale = size[0]/size[1]  # 設定 scale 為 width/height
        w = int(max*scale)       # 設定調整後的寬度為 max 乘以 scale ( 使用 int 去除小數點 )
        h = max                  # 設定調整後的高度為最大的數值
    name = i.split('/')[::-1][0]
    im2 = im.resize((w, h))      # 調整尺寸
    im2.save(f'./oxxo/resize/{name}')

Python 教學 - 批次調整圖片尺寸

小結

透過批次調整圖片尺寸的方式,就能輕鬆建立許多大張圖片的縮圖,節省開啟影像處理軟體調整的時間。

更多 Python 教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 2 ) 批次圖片轉檔 ( jpg、png、gif、pdf...等 )
下一篇
( Day 4 ) 調整圖片亮度、對比、飽和度和銳利度
系列文
學 Python 到底可以幹麻勒?41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言