Come posso ottenere le dimensioni dell'immagine con PIL?


Risposte:


485
from PIL import Image

im = Image.open('whatever.png')
width, height = im.size

Secondo la documentazione .


8
Se vuoi anche sapere il numero di canali, dovresti usare im.mode. Poiché PIL è un po 'enigmatico, puoi anche usare il numpy:numpy.array(im).shape
Alex Kreimer il

9
Nota @AlexKreimer che l'utilizzo di .shaperisultati restituisce risultati diversi poiché l'altezza è il primo dell'array 2d, quindi larghezza. Pertantoheight, width = np.array(im).shape
Jack Hales

Si prega di utilizzare with.
Shital Shah,

@AlexKreimer: np.array(im).shapeNON restituisce il numero di canali, piuttosto restituisce heighte width!
Färid Alijani,

@ FäridAlijani certo, restituisce la forma di un tensore, che (possibilmente) include il numero di canali. Se ricevi solo 2 dim, probabilmente significa che il numero di canali è 1.
Alex Kreimer,

77

È possibile utilizzare Pillow ( sito Web , documentazione , GitHub , PyPI ). Pillow ha la stessa interfaccia di PIL, ma funziona con Python 3.

Installazione

$ pip install Pillow

Se non hai i diritti di amministratore (sudo su Debian), puoi usare

$ pip install --user Pillow

Altre note relative all'installazione sono qui .

Codice

from PIL import Image
with Image.open(filepath) as img:
    width, height = img.size

Velocità

Ciò ha richiesto 3,21 secondi per 30336 immagini (JPG da 31x21 a 424x428, dati di allenamento da National Data Science Bowl on Kaggle)

Questo è probabilmente il motivo più importante per usare Pillow invece di qualcosa di auto-scritto. E dovresti usare Pillow invece di PIL (python-imaging), perché funziona con Python 3.

Alternativa n. 1: Numpy (obsoleto)

Continuo scipy.ndimage.imreadperché le informazioni sono ancora là fuori, ma tenere a mente:

imread è deprecato! imread è deprecato in SciPy 1.0.0 e [è stato rimosso in 1.2.0.

import scipy.ndimage
height, width, channels = scipy.ndimage.imread(filepath).shape

Alternativa n. 2: Pygame

import pygame
img = pygame.image.load(filepath)
width = img.get_width()
height = img.get_height()

è Image.open(filepath)più veloce del cv2.imread(filepath)metodo?
Färid Alijani,

6

Dal momento scipyche imreadè deprecato, utilizzare imageio.imread.

  1. Installa - pip install imageio
  2. Uso height, width, channels = imageio.imread(filepath).shape

3

Questo è un esempio completo di caricamento dell'immagine dall'URL, creazione con PIL, stampa delle dimensioni e ridimensionamento ...

import requests
h = { 'User-Agent': 'Neo'}
r = requests.get("https://images.freeimages.com/images/large-previews/85c/football-1442407.jpg", headers=h)

from PIL import Image
from io import BytesIO
# create image from binary content
i = Image.open(BytesIO(r.content))


width, height = i.size
print(width, height)
i = i.resize((100,100))
display(i)

1

Ecco come ottenere le dimensioni dell'immagine dall'URL indicato in Python 3:

from PIL import Image
import urllib.request
from io import BytesIO

file = BytesIO(urllib.request.urlopen('http://getwallpapers.com/wallpaper/full/b/8/d/32803.jpg').read())
im = Image.open(file)
width, height = im.size

0

Di seguito vengono fornite le dimensioni e i canali:

import numpy as np
from PIL import Image

with Image.open(filepath) as img:
    shape = np.array(img).shape
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.