Как я могу получить размер изображения с PIL?

Ответы:

485
from PIL import Image

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

Согласно документации .

phimuemue
источник
8
Если вы также хотите узнать количество каналов, вы должны использовать im.mode. Поскольку PIL немного загадочен, вы также можете использовать numpy:numpy.array(im).shape
Alex
9
Обратите внимание на @AlexKreimer, который при использовании .shapeприводит к разным возвращениям, так как высота - это сначала массив 2d, а затем ширина. Поэтомуheight, width = np.array(im).shape
Джек Хейлз
Пожалуйста, используйте with.
Шиталь Шах
@AlexKreimer: np.array(im).shapeНЕ возвращает количество каналов, скорее возвращает heightи width!
Ферид Алиджани
@ FäridAlijani уверен, он возвращает форму тензора, который (возможно) включает в себя количество каналов. Если вы получаете только 2 димма, это, вероятно, означает, что количество каналов равно 1.
Алекс Креймер
77

Вы можете использовать подушку ( сайт , документация , GitHub , PyPI ). Подушка имеет тот же интерфейс, что и PIL, но работает с Python 3.

Монтаж

$ pip install Pillow

Если у вас нет прав администратора (sudo в Debian), вы можете использовать

$ pip install --user Pillow

Другие замечания относительно установки здесь .

Код

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

скорость

Это потребовало 3,21 секунды для 30336 изображений (файлы JPG от 31x21 до 424x428, данные обучения от National Data Science Bowl на Kaggle)

Это, наверное, самая важная причина, чтобы использовать подушку вместо чего-то написанного самим собой. И вам следует использовать Pillow вместо PIL (python-imaging), потому что он работает с Python 3.

Альтернатива № 1: Numpy (не рекомендуется)

Я держу, scipy.ndimage.imreadпоскольку информация все еще там, но имейте в виду:

imread устарела! imread устарела в SciPy 1.0.0 и [была] удалена в 1.2.0.

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

Альтернатива № 2: Pygame

import pygame
img = pygame.image.load(filepath)
width = img.get_width()
height = img.get_height()
Мартин Тома
источник
это Image.open(filepath)быстрее , чем cv2.imread(filepath)метод?
Ферид Алиджани
6

Поскольку scipy«s imreadявляется устаревшим, использование imageio.imread.

  1. Установить - pip install imageio
  2. использование height, width, channels = imageio.imread(filepath).shape
bluesummers
источник
3

Это полный пример загрузки изображения из URL, создания с помощью PIL, печати размера и изменения размера ...

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

Вот как вы получаете размер изображения по указанному URL в 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

Ниже приведены размеры, а также каналы:

import numpy as np
from PIL import Image

with Image.open(filepath) as img:
    shape = np.array(img).shape
Шиталь шах
источник