¿Cómo obtengo el tamaño de la imagen con PIL?

Respuestas:

485
from PIL import Image

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

De acuerdo con la documentación .

phimuemue
fuente
8
Si también desea saber la cantidad de canales, debe usar im.mode. Como PIL es un poco críptico, también puedes usar numpy:numpy.array(im).shape
Alex Kreimer
9
Tenga en cuenta @AlexKreimer que el uso de .shaperesultados en diferentes retornos ya que la altura es el primero de la matriz 2d, luego el ancho. Por lo tantoheight, width = np.array(im).shape
Jack Hales
Por favor use with.
Shital Shah
@AlexKreimer: np.array(im).shapeNO devuelve el número de canales, sino que devuelve heighty width!
Färid Alijani
@ FäridAlijani seguro, devuelve la forma de un tensor, que (posiblemente) incluye el número de canales. Si solo obtienes 2 dims, probablemente significa que la cantidad de canales es 1.
Alex Kreimer
77

Puede usar Pillow ( sitio web , documentación , GitHub , PyPI ). Pillow tiene la misma interfaz que PIL, pero funciona con Python 3.

Instalación

$ pip install Pillow

Si no tiene derechos de administrador (sudo en Debian), puede usar

$ pip install --user Pillow

Otras notas sobre la instalación están aquí .

Código

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

Velocidad

Esto necesitó 3.21 segundos para 30336 imágenes (JPG de 31x21 a 424x428, datos de entrenamiento del National Data Science Bowl en Kaggle)

Esta es probablemente la razón más importante para usar Pillow en lugar de algo escrito por uno mismo. Y debe usar Pillow en lugar de PIL (python-imaging), porque funciona con Python 3.

Alternativa # 1: Numpy (en desuso)

Mantengo scipy.ndimage.imreadque la información aún está disponible, pero tenga en cuenta:

¡iread está en desuso! imread está en desuso en SciPy 1.0.0, y [fue] eliminado en 1.2.0.

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

Alternativa # 2: Pygame

import pygame
img = pygame.image.load(filepath)
width = img.get_width()
height = img.get_height()
Martin Thoma
fuente
es Image.open(filepath)más rápido que el cv2.imread(filepath)método?
Färid Alijani
6

Como scipy's imreadestá en desuso, use imageio.imread.

  1. Instalar en pc - pip install imageio
  2. Utilizar height, width, channels = imageio.imread(filepath).shape
verano azul
fuente
3

Este es un ejemplo completo de carga de imágenes desde URL, creación con PIL, impresión del tamaño y cambio de tamaño ...

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
fuente
1

Así es como obtienes el tamaño de la imagen de la URL dada en 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
fuente
0

Los siguientes dan dimensiones y canales:

import numpy as np
from PIL import Image

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