Come alludono i commenti, PIL non carica l'immagine in memoria durante la chiamata .open
. Guardando i documenti di PIL 1.1.7
, la docstring per .open
dice:
def open(fp, mode="r"):
"Open an image file, without loading the raster data"
Ci sono alcune operazioni sui file nell'origine come:
...
prefix = fp.read(16)
...
fp.seek(0)
...
ma questi difficilmente costituiscono la lettura dell'intero file. Infatti .open
restituisce semplicemente un oggetto file e il nome del file in caso di successo. Inoltre i documenti dicono:
open (file, mode = "r")
Apre e identifica il file immagine specificato.
Questa è un'operazione pigra; questa funzione identifica il file, ma i dati effettivi dell'immagine non vengono letti dal file finché non si tenta di elaborare i dati (o chiamare il metodo di caricamento ).
Scavando più a fondo, vediamo che le .open
chiamate _open
sono un sovraccarico specifico del formato immagine. Ciascuna delle implementazioni _open
può essere trovata in un nuovo file, ad es. I file .jpeg sono in formato JpegImagePlugin.py
. Diamo un'occhiata a quello in profondità.
Qui le cose sembrano diventare un po 'complicate, in esso c'è un ciclo infinito che viene interrotto quando viene trovato il marcatore jpeg:
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")
Che sembra che potrebbe leggere l'intero file se fosse malformato. Tuttavia, se legge l'indicatore di informazioni OK, dovrebbe uscire presto. La funzione handler
infine stabilisce self.size
quali sono le dimensioni dell'immagine.
.open()
legga l'intero file in memoria ... (ecco cosa.load()
) fa - per quanto ne so - questo è buono come viene utilizzatoPIL