Bagaimana saya mendapatkan ukuran gambar dengan PIL?

Jawaban:

485
from PIL import Image

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

Menurut dokumentasi .

phimuemue
sumber
8
Jika Anda juga ingin tahu jumlah saluran, Anda harus menggunakan im.mode. Karena PIL agak samar, Anda juga dapat menggunakan numpy:numpy.array(im).shape
Alex Kreimer
9
Catatan @AlexKreimer yang menggunakan .shapehasil dalam pengembalian yang berbeda karena ketinggian adalah yang pertama dari array 2d, lalu lebar. Karena ituheight, width = np.array(im).shape
Jack Hales
Silakan gunakan with.
Shital Shah
@AlexKreimer: np.array(im).shapeTIDAK mengembalikan jumlah saluran, melainkan kembali heightdan width!
Färid Alijani
@ FäridAlijani yakin, ia mengembalikan bentuk tensor, yang (mungkin) mencakup jumlah saluran. Jika Anda hanya mendapatkan 2 redup, itu mungkin berarti bahwa jumlah saluran adalah 1.
Alex Kreimer
77

Anda dapat menggunakan Bantal ( Situs Web , Dokumentasi , GitHub , PyPI ). Bantal memiliki antarmuka yang sama dengan PIL, tetapi berfungsi dengan Python 3.

Instalasi

$ pip install Pillow

Jika Anda tidak memiliki hak administrator (sudo di Debian), Anda dapat menggunakan

$ pip install --user Pillow

Catatan lain tentang instalasi ada di sini .

Kode

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

Mempercepat

Ini membutuhkan 3,21 detik untuk 30336 gambar (JPG dari 31x21 hingga 424x428, data pelatihan dari National Data Science Bowl on Kaggle)

Ini mungkin alasan paling penting untuk menggunakan Bantal daripada menulis sendiri. Dan Anda harus menggunakan Pillow daripada PIL (python-imaging), karena itu berfungsi dengan Python 3.

Alternatif # 1: Numpy (usang)

Saya simpan scipy.ndimage.imreadkarena informasinya masih di luar sana, tetapi perlu diingat:

imread sudah usang! imread sudah tidak digunakan lagi di SciPy 1.0.0, dan [sudah] dihapus di 1.2.0.

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

Alternatif # 2: Pygame

import pygame
img = pygame.image.load(filepath)
width = img.get_width()
height = img.get_height()
Martin Thoma
sumber
adalah Image.open(filepath)lebih cepat dari cv2.imread(filepath)metode?
Färid Alijani
6

Sejak scipy's imreadsudah ditinggalkan, penggunaan imageio.imread.

  1. Install - pip install imageio
  2. Menggunakan height, width, channels = imageio.imread(filepath).shape
bluesummers
sumber
3

Ini adalah contoh lengkap memuat gambar dari URL, membuat dengan PIL, mencetak ukuran dan mengubah ukuran ...

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
sumber
1

Inilah cara Anda mendapatkan ukuran gambar dari URL yang diberikan dengan 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
sumber
0

Berikut ini memberikan dimensi serta saluran:

import numpy as np
from PIL import Image

with Image.open(filepath) as img:
    shape = np.array(img).shape
Shital Shah
sumber