Як отримати розмір зображення за допомогою PIL?


Відповіді:


484
from PIL import Image

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

Відповідно до документації .


8
Якщо ви також хочете знати кількість каналів, вам слід скористатися im.mode. Оскільки PIL трохи дурний, ви можете також використовувати numpy:numpy.array(im).shape
Alex Kreimer

9
Зауважте @AlexKreimer, що використання .shapeрезультатів у різних поверненнях, оскільки висота - це перший масив 2d, а потім ширина. Томуheight, width = np.array(im).shape
Джек Хейлз

Будь ласка, використовуйте with.
Shital Shah

@AlexKreimer: np.array(im).shapeНЕ повертає кількість каналів, швидше повертає heightта width!
Färid Alijani

@ 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 on Kaggle)

Це, мабуть, найважливіша причина використовувати Подушку замість чогось написаного самостійно. І вам слід використовувати Pillow замість PIL (python-imaging), оскільки він працює з Python 3.

Альтернатива №1: нуклеотична (застаріла)

Я зберігаю, scipy.ndimage.imreadоскільки інформація все ще там, але пам’ятайте:

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

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

Альтернатива №2: Пігама

import pygame
img = pygame.image.load(filepath)
width = img.get_width()
height = img.get_height()

це Image.open(filepath)швидше , ніж cv2.imread(filepath)метод?
Färid Alijani

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.