Comment obtenir la taille d'image avec PIL?

Réponses:

485
from PIL import Image

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

Selon la documentation .

phimuemue
la source
8
Si vous souhaitez également connaître le nombre de canaux, vous devez utiliser im.mode. Puisque PIL est un peu cryptique, vous pouvez également utiliser numpy:numpy.array(im).shape
Alex Kreimer
9
Notez @AlexKreimer que l'utilisation .shapeentraîne des résultats différents, car la hauteur est le premier du tableau 2D, puis la largeur. Par conséquentheight, width = np.array(im).shape
Jack Hales
Veuillez utiliser with.
Shital Shah
@AlexKreimer: np.array(im).shapene renvoie PAS le nombre de canaux, il renvoie plutôt heightet width!
Färid Alijani
@ FäridAlijani bien sûr, il renvoie la forme d'un tenseur, qui inclut (éventuellement) le nombre de canaux. Si vous obtenez seulement 2 dims, cela signifie probablement que le nombre de canaux est de 1.
Alex Kreimer
77

Vous pouvez utiliser Pillow ( Site Web , Documentation , GitHub , PyPI ). Pillow a la même interface que PIL, mais fonctionne avec Python 3.

Installation

$ pip install Pillow

Si vous n'avez pas de droits d'administrateur (sudo sur Debian), vous pouvez utiliser

$ pip install --user Pillow

D'autres notes concernant l'installation sont ici .

Code

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

La vitesse

Cela a nécessité 3,21 secondes pour 30336 images (JPG de 31x21 à 424x428, données d'entraînement de National Data Science Bowl sur Kaggle)

C'est probablement la raison la plus importante d'utiliser Pillow au lieu de quelque chose d'auto-écrit. Et vous devriez utiliser Pillow au lieu de PIL (imagerie python), car cela fonctionne avec Python 3.

Alternative n ° 1: Numpy (obsolète)

Je garde scipy.ndimage.imreadcar les informations sont toujours là, mais gardez à l'esprit:

imread est déconseillé! imread est déconseillé dans SciPy 1.0.0 et [a été] supprimé dans 1.2.0.

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

Alternative n ° 2: Pygame

import pygame
img = pygame.image.load(filepath)
width = img.get_width()
height = img.get_height()
Martin Thoma
la source
est Image.open(filepath)plus rapide que la cv2.imread(filepath)méthode?
Färid Alijani
6

Puisque scipys imreadest obsolète, utilisez imageio.imread.

  1. Installer - pip install imageio
  2. Utilisation height, width, channels = imageio.imread(filepath).shape
bluesummers
la source
3

Ceci est un exemple complet de chargement d'image à partir d'une URL, de création avec PIL, d'impression de la taille et de redimensionnement ...

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)
prosti
la source
1

Voici comment obtenir la taille de l'image à partir de l'URL donnée dans 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
Dmytro Lopushanskyy
la source
0

Followings donne des dimensions ainsi que des canaux:

import numpy as np
from PIL import Image

with Image.open(filepath) as img:
    shape = np.array(img).shape
Shital Shah
la source