Bagaimana saya mendapatkan ukuran gambar dengan PIL?


Jawaban:


485
from PIL import Image

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

Menurut dokumentasi .


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()

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

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)

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.