Wie erhalte ich mit PIL die Bildgröße?


Antworten:


484
from PIL import Image

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

Laut Dokumentation .


8
Wenn Sie auch die Anzahl der Kanäle wissen möchten, sollten Sie verwenden im.mode. Da PIL etwas kryptisch ist, können Sie auch numpy verwenden:numpy.array(im).shape
Alex Kreimer

9
Beachten Sie @AlexKreimer, dass die Verwendung .shapezu unterschiedlichen Rückgaben führt, da die Höhe das erste des 2d-Arrays und dann die Breite ist. Deshalbheight, width = np.array(im).shape
Jack Hales

Bitte benutzen with.
Shital Shah

@AlexKreimer: np.array(im).shapegibt NICHT die Anzahl der Kanäle zurück, sondern heightund width!
Färid Alijani

@ FäridAlijani sicher, es gibt die Form eines Tensors zurück, der (möglicherweise) die Anzahl der Kanäle enthält. Wenn Sie nur 2 Dims erhalten, bedeutet dies wahrscheinlich, dass die Anzahl der Kanäle 1 beträgt.
Alex Kreimer

77

Sie können Pillow ( Website , Dokumentation , GitHub , PyPI) verwenden ) verwenden. Pillow hat die gleiche Oberfläche wie PIL, funktioniert jedoch mit Python 3.

Installation

$ pip install Pillow

Wenn Sie keine Administratorrechte haben (sudo on Debian), können Sie verwenden

$ pip install --user Pillow

Weitere Hinweise zur Installation finden Sie hier .

Code

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

Geschwindigkeit

Dies dauerte 3,21 Sekunden für 30336 Bilder (JPGs von 31 x 21 bis 424 x 428, Trainingsdaten von National Data Science Bowl auf Kaggle)

Dies ist wahrscheinlich der wichtigste Grund, Pillow anstelle von etwas Selbstgeschriebenem zu verwenden. Und Sie sollten Pillow anstelle von PIL (Python-Imaging) verwenden, da es mit Python 3 funktioniert.

Alternative Nr. 1: Numpy (veraltet)

Ich behalte, scipy.ndimage.imreadda die Informationen immer noch da draußen sind, aber denke daran:

imread ist veraltet! imread ist in SciPy 1.0.0 veraltet und [wurde] in 1.2.0 entfernt.

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

Alternative Nr. 2: Pygame

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

ist Image.open(filepath)schneller als cv2.imread(filepath)Methode?
Färid Alijani

6

Da scipy's imreadveraltet ist, verwenden Sie imageio.imread.

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

3

Dies ist ein vollständiges Beispiel für das Laden eines Bildes von einer URL, das Erstellen mit PIL, das Drucken der Größe und das Ändern der Größe ...

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

So erhalten Sie die Bildgröße von der angegebenen URL in 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

Das Folgende gibt Dimensionen sowie Kanäle an:

import numpy as np
from PIL import Image

with Image.open(filepath) as img:
    shape = np.array(img).shape
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.