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


Ответы:


485
from PIL import Image

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

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


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

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.