Skip to content

Ridimensionare le immagini con Python, Pillow

Python

Il modulo immagine della libreria di elaborazione delle immagini Pillow (PIL) fornisce il metodo resize() per ridimensionare le immagini.

Image.resize(size, resample=0)
Restituisce una copia ridotta di questa immagine.
Modulo immagine: documentazione Cuscino (PIL Fork) 4.0.0

In questo articolo vengono descritti i seguenti contenuti.

  • Vieni a usare Image.resize()
  • Codice di esempio per il ridimensionamento batch
    • Ridimensiona solo i file con ulteriori specifiche
    • Ridimensiona tutti i file di immagine supportati da Pillow

Vedere il seguente articolo per l’installazione e l’utilizzo di base di Pillow (PIL).

Usa crop() per ritagliare una parte dell’immagine.

Vieni a usare Image.resize()

Passa una tupla di (larghezza, altezza) alla dimensione dell’argomento.

Passa il filtro utilizzato per il ricampionamento all’argomento resample. Ci sono i seguenti 6 tipi. Se omesso, viene utilizzato automaticamente NEAREST.

Filtri
– PIÙ VICINO
– BOX
– BILINEARE
– HAMMING
– BICUBIC
– LANCZOS
Concepts — Pillow (PIL Fork) 4.0.0 documentazione

from PIL import Image

img = Image.open('data/src/lena_square.png')

img_resize = img.resize((256, 256))
img_resize.save('data/dst/lena_pillow_resize_nearest.jpg')

img_resize_lanczos = img.resize((256, 256), Image.LANCZOS)
img_resize_lanczos.save('data/dst/lena_pillow_resize_lanczos.jpg')

BICUBIC e LANCZOS impiegano più tempo per l’elaborazione rispetto a VICINO, ma la qualità è migliore.

L’immagine a sinistra viene ridotta dal filtro NEAREST e l’immagine a destra viene ridotta dal filtro LANCZOS.

Ridimensionamento cuscino Più vicino
Cuscino ridimensionato Lanczos

Nell’esempio sopra, la dimensione dell’immagine è fissata come (256, 256). Per specificarlo in base alle dimensioni dell’immagine originale, procedere come segue.

img_resize = img.resize((img.width // 2, img.height // 2))
img_resize_lanczos.save('data/dst/lena_pillow_resize_half.jpg')

Poiché la dimensione deve essere specificata come numero intero, viene utilizzato //.

Codice di esempio per il ridimensionamento batch

Per il ridimensionamento batch, ottenere la stringa di percorso dei file nella cartella di destinazione (directory) con glob(), ridimensionarli con resize() e salvarli con il nuovo nome file con save().

Ridimensiona solo i file con ulteriori specifiche

Il codice di esempio per estrarre solo i file con estensione jpg è il seguente:

import os
import glob
from PIL import Image

dst_dir = 'data/temp/images_half'
os.makedirs(dst_dir, exist_ok=True)

files = glob.glob('./data/temp/images/*.jpg')

for f in files:
    img = Image.open(f)
    img_resize = img.resize((img.width // 2, img.height // 2))
    root, ext = os.path.splitext(f)
    basename = os.path.basename(root)
    img_resize.save(os.path.join(dst_dir, basename + '_half' + ext))

Se vuoi ottenere file con più estratto, puoi selezionarli dopo aver i percorsi di tutti i file con glob().

files = glob.glob('./data/temp/images/*')

for f in files:
    root, ext = os.path.splitext(f)
    if ext in ['.jpg', '.png']:
        img = Image.open(f)
        img_resize = img.resize((img.width // 2, img.height // 2))
        basename = os.path.basename(root)
        img_resize.save(os.path.join(dst_dir, basename + '_half' + ext))

Ridimensiona tutti i file di immagine supportati da Pillow

Se vuoi ridurre tutti i file di immagine supportati da Pillow invece di estrarli per estensione, usa try … eccetto … per gestire le eccezioni. È più facile che specificare in modo esplicito più estensione.

files = glob.glob('./data/temp/images/*')

for f in files:
    try:
        img = Image.open(f)
        img_resize = img.resize((img.width // 2, img.height // 2))
        root, ext = os.path.splitext(f)
        basename = os.path.basename(root)
        img_resize.save(os.path.join(dst_dir, basename + '_half' + ext))
    except OSError as e:
        pass