Saya memahami bahwa Anda bisa mendapatkan ukuran gambar menggunakan PIL dengan cara berikut
from PIL import Image
im = Image.open(image_filename)
width, height = im.size
Namun demikian, saya ingin mendapatkan lebar dan tinggi gambar tanpa harus memuat gambar di memori. Apakah itu mungkin? Saya hanya melakukan statistik tentang ukuran gambar dan tidak peduli dengan konten gambar. Saya hanya ingin mempercepat proses saya.
python
image
image-processing
Sami A. Haija
sumber
sumber
.open()
membaca seluruh file ke dalam memori ... (itulah yang.load()
) dilakukan - sejauh yang saya tahu - ini sebagus yang digunakanPIL
pmap
untuk memantau memori yang digunakan oleh suatu proses menunjukkan kepada saya bahwa memangPIL
tidak memuat seluruh gambar dalam memori.Jawaban:
Seperti yang disinggung dalam komentar, PIL tidak memuat gambar ke dalam memori saat memanggil
.open
. Melihat dokumen dariPIL 1.1.7
, docstring untuk.open
mengatakan:Ada beberapa operasi file di sumber seperti:
tapi ini bukan berarti membaca keseluruhan file. Sebenarnya
.open
hanya mengembalikan objek file dan nama file pada kesuksesan. Selain itu, dokumen tersebut mengatakan:Menggali lebih dalam, kita melihat bahwa
.open
panggilan_open
yang merupakan kelebihan beban khusus format gambar. Setiap implementasi_open
dapat ditemukan di file baru, mis. File .jpeg ada dalamJpegImagePlugin.py
. Mari kita lihat secara mendalam.Di sini hal-hal tampaknya menjadi sedikit rumit, di dalamnya ada loop tak terbatas yang rusak saat penanda jpeg ditemukan:
Yang sepertinya bisa membaca seluruh file jika formatnya salah. Jika membaca penanda info OK, bagaimanapun, itu harus keluar lebih awal. Fungsi
handler
akhirnya menetapkanself.size
dimensi gambar.sumber
open
mendapatkan ukuran gambar atau apakah itu operasi yang malas juga? Dan jika malas, apakah ia membaca data gambar pada saat yang sama?Docs/PIL.Image.html
..jpeg
Format terlihat OK selama header ditemukan.Jika Anda tidak peduli dengan konten gambar, PIL mungkin berlebihan.
Saya menyarankan untuk mengurai output dari modul ajaib python:
Ini adalah pembungkus libmagic yang membaca sesedikit mungkin byte untuk mengidentifikasi tanda tangan tipe file.
Versi skrip yang relevan:
https://raw.githubusercontent.com/scardine/image_size/master/get_image_size.py
[memperbarui]
Sepertinya jpeg tahan sihir. :-)
Saya bisa mengerti alasannya: untuk mendapatkan dimensi gambar untuk file JPEG, Anda mungkin harus membaca lebih banyak byte daripada libmagic yang suka membaca.
Menyingsingkan lengan baju saya dan datang dengan cuplikan yang sangat belum teruji ini (dapatkan dari GitHub) yang tidak memerlukan modul pihak ketiga.
[perbarui 2019]
Lihat implementasi Rust: https://github.com/scardine/imsz
sumber
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
di MacOS, python3 aktifdata = input.read(25)
,file
pada gambar memberiPNG image data, 720 x 857, 8-bit/color RGB, non-interlaced
Ada sebuah paket di pypi bernama
imagesize
yang saat ini berfungsi untuk saya, meskipun sepertinya tidak sangat aktif.Install:
Pemakaian:
Beranda: https://github.com/shibukawa/imagesize_py
PyPi: https://pypi.org/project/imagesize/
sumber
Saya sering mengambil ukuran gambar di Internet. Tentu saja, Anda tidak dapat mengunduh gambar dan memuatnya untuk mengurai informasi. Itu terlalu memakan waktu. Metode saya adalah memberi makan potongan ke wadah gambar dan menguji apakah itu dapat mengurai gambar setiap saat. Hentikan pengulangan ketika saya mendapatkan informasi yang saya inginkan.
Saya mengekstrak inti kode saya dan memodifikasinya untuk mengurai file lokal.
Keluaran:
Ukuran file sebenarnya adalah 1.543.580 byte dan Anda hanya membaca 38.912 byte untuk mendapatkan ukuran gambar. Semoga ini bisa membantu.
sumber
Cara singkat lain untuk melakukannya di sistem Unix. Itu tergantung pada output
file
yang saya tidak yakin telah distandarisasi pada semua sistem. Ini mungkin tidak boleh digunakan dalam kode produksi. Selain itu, kebanyakan JPEG tidak melaporkan ukuran gambar.sumber
IndexError: list index out of range
Jawaban ini memiliki resolusi bagus lainnya, tetapi format pgm tidak ada . Jawaban ini telah menyelesaikan pgm . Dan saya menambahkan bmp .
Kode di bawah
sumber
imghdr
namun menangani jpeg tertentu dengan sangat buruk.