Como obtenho o tamanho da imagem com o PIL?


Respostas:


485
from PIL import Image

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

De acordo com a documentação .


8
Se você também quiser saber o número de canais, deve usar im.mode. Como o PIL é um pouco enigmático, você também pode usar numpy: #numpy.array(im).shape
Alex Kreimer 17/17

9
Observe @AlexKreimer que o uso .shaperesulta em retornos diferentes, já que a altura é a primeira da matriz 2D e, em seguida, a largura. Portantoheight, width = np.array(im).shape
Jack Hales

Por favor use with.
Shital Shah

@AlexKreimer: np.array(im).shapenão retorna número de canais, que é bastante retornos heighte width!
Färid Alijani

@ FäridAlijani Com certeza, ele retorna a forma de um tensor, que (possivelmente) inclui o número de canais. Se você receber apenas 2 dims, provavelmente significa que o número de canais é 1.
Alex Kreimer

77

Você pode usar o Pillow ( site , documentação , GitHub , PyPI ). O Pillow possui a mesma interface do PIL, mas funciona com o Python 3.

Instalação

$ pip install Pillow

Se você não possui direitos de administrador (sudo no Debian), você pode usar

$ pip install --user Pillow

Outras notas sobre a instalação estão aqui .

Código

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

Rapidez

Foram necessários 3,21 segundos para imagens 30336 (JPGs de 31x21 a 424x428, dados de treinamento do National Data Science Bowl no Kaggle)

Esta é provavelmente a razão mais importante para usar o Pillow em vez de algo auto-escrito. E você deve usar Pillow em vez de PIL (imagem em python), porque funciona com o Python 3.

Alternativa 1: Numpy (descontinuado)

Eu mantenho scipy.ndimage.imreadcomo as informações ainda estão por aí, mas lembre-se:

imread está obsoleto! O imread foi descontinuado no SciPy 1.0.0 e [foi] removido no 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()

é Image.open(filepath)mais rápido que o cv2.imread(filepath)método?
Färid Alijani

6

Como scipy's imreadestá obsoleto, use imageio.imread.

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

3

Este é um exemplo completo de carregamento de imagem do URL, criação com PIL, impressão do tamanho e redimensionamento ...

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

Veja como você obtém o tamanho da imagem a partir do URL fornecido no 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

A seguir, são apresentadas as dimensões e os canais:

import numpy as np
from PIL import Image

with Image.open(filepath) as img:
    shape = np.array(img).shape
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.