Seperti yang disinggung dalam komentar, PIL tidak memuat gambar ke dalam memori saat memanggil .open
. Melihat dokumen dari PIL 1.1.7
, docstring untuk .open
mengatakan:
def open(fp, mode="r"):
"Open an image file, without loading the raster data"
Ada beberapa operasi file di sumber seperti:
...
prefix = fp.read(16)
...
fp.seek(0)
...
tapi ini bukan berarti membaca keseluruhan file. Sebenarnya .open
hanya mengembalikan objek file dan nama file pada kesuksesan. Selain itu, dokumen tersebut mengatakan:
buka (file, mode = ”r”)
Membuka dan mengidentifikasi file gambar yang diberikan.
Ini adalah operasi yang malas; fungsi ini mengidentifikasi file, tetapi data gambar yang sebenarnya tidak dibaca dari file sampai Anda mencoba memproses data (atau memanggil metode pemuatan ).
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 dalam JpegImagePlugin.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:
while True:
s = s + self.fp.read(1)
i = i16(s)
if i in MARKER:
name, description, handler = MARKER[i]
# print hex(i), name, description
if handler is not None:
handler(self, i)
if i == 0xFFDA: # start of scan
rawmode = self.mode
if self.mode == "CMYK":
rawmode = "CMYK;I" # assume adobe conventions
self.tile = [("jpeg", (0,0) + self.size, 0, (rawmode, ""))]
# self.__offset = self.fp.tell()
break
s = self.fp.read(1)
elif i == 0 or i == 65535:
# padded marker or junk; move on
s = "\xff"
else:
raise SyntaxError("no marker found")
Yang sepertinya bisa membaca seluruh file jika formatnya salah. Jika membaca penanda info OK, bagaimanapun, itu harus keluar lebih awal. Fungsi handler
akhirnya menetapkan self.size
dimensi gambar.
.open()
membaca seluruh file ke dalam memori ... (itulah yang.load()
) dilakukan - sejauh yang saya tahu - ini sebagus yang digunakanPIL