Jak uzyskać rozmiar obrazu za pomocą PIL?

Odpowiedzi:

484
from PIL import Image

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

Zgodnie z dokumentacją .

phimuemue
źródło
8
Jeśli chcesz również poznać liczbę kanałów, powinieneś użyć im.mode. Ponieważ PIL jest nieco tajemniczy, możesz także użyć numpy:numpy.array(im).shape
Alex Kreimer
9
Uwaga @AlexKreimer, że użycie .shapepowoduje różne zwroty, ponieważ wysokość jest pierwszą z tablicy 2d, a następnie szerokością. Dlategoheight, width = np.array(im).shape
Jack Hales
Proszę używać with.
Shital Shah
@AlexKreimer: np.array(im).shapeNIE zwraca liczby kanałów, raczej zwraca heighti width!
Färid Alijani
@ FäridAlijani, na pewno zwraca kształt tensora, który (ewentualnie) obejmuje liczbę kanałów. Jeśli dostaniesz tylko 2 przyciemnienia, prawdopodobnie oznacza to, że liczba kanałów wynosi 1.
Alex Kreimer
77

Możesz użyć Pillow ( strona internetowa , dokumentacja , GitHub , PyPI ). Poduszka ma taki sam interfejs jak PIL, ale współpracuje z Python 3.

Instalacja

$ pip install Pillow

Jeśli nie masz uprawnień administratora (sudo na Debianie), możesz użyć

$ pip install --user Pillow

Inne uwagi dotyczące instalacji są tutaj .

Kod

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

Prędkość

Wymagało to 3,21 sekundy na 30336 zdjęć (JPG od 31x21 do 424x428, dane treningowe z National Data Science Bowl na Kaggle)

Jest to prawdopodobnie najważniejszy powód, aby używać poduszki zamiast czegoś napisanego samodzielnie. I powinieneś używać Pillow zamiast PIL (obrazowanie python), ponieważ działa z Python 3.

Alternatywa nr 1: Numpy (przestarzałe)

Trzymam, scipy.ndimage.imreadponieważ informacje są nadal dostępne, ale pamiętaj:

odczytywanie jest przestarzałe! Imread jest przestarzały w SciPy 1.0.0, a [został] usunięty w 1.2.0.

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

Alternatywa # 2: Pygame

import pygame
img = pygame.image.load(filepath)
width = img.get_width()
height = img.get_height()
Martin Thoma
źródło
jest Image.open(filepath)szybszy niż cv2.imread(filepath)metoda?
Färid Alijani
6

Ponieważ scipy„s imreadjest przestarzała, użycie imageio.imread.

  1. Zainstalować - pip install imageio
  2. Posługiwać się height, width, channels = imageio.imread(filepath).shape
bluesummers
źródło
3

To kompletny przykład ładowania obrazu z adresu URL, tworzenia za pomocą PIL, drukowania rozmiaru i zmiany rozmiaru ...

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
źródło
1

Oto jak uzyskać rozmiar obrazu z podanego adresu URL w 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
źródło
0

Poniżej podano wymiary oraz kanały:

import numpy as np
from PIL import Image

with Image.open(filepath) as img:
    shape = np.array(img).shape
Shital Shah
źródło