Wie in den Kommentaren erwähnt, lädt PIL das Bild beim Aufruf nicht in den Speicher .open
. Wenn Sie sich die Dokumente von PIL 1.1.7
ansehen, .open
sagt der Dokumentstring für :
def open(fp, mode="r"):
"Open an image file, without loading the raster data"
Es gibt einige Dateioperationen in der Quelle wie:
...
prefix = fp.read(16)
...
fp.seek(0)
...
aber diese bilden kaum das Lesen der gesamten Datei. Tatsächlich wird .open
bei Erfolg einfach ein Dateiobjekt und der Dateiname zurückgegeben. Zusätzlich sagen die Dokumente :
öffnen (Datei, Modus = ”r”)
Öffnet und identifiziert die angegebene Bilddatei.
Dies ist eine faule Operation; Diese Funktion identifiziert die Datei, aber die tatsächlichen Bilddaten werden erst aus der Datei gelesen, wenn Sie versuchen, die Daten zu verarbeiten (oder die Lademethode aufzurufen ).
Wenn wir tiefer graben, sehen wir, dass .open
Anrufe _open
eine bildformatspezifische Überlastung darstellen. Jede der zu implementierenden Implementierungen _open
befindet sich in einer neuen Datei, z. JPEG-Dateien befinden sich in JpegImagePlugin.py
. Schauen wir uns das genauer an.
Hier scheinen die Dinge etwas knifflig zu werden. Darin befindet sich eine Endlosschleife, aus der herausgebrochen wird, wenn der JPEG-Marker gefunden wird:
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")
Das sieht so aus, als könnte es die gesamte Datei lesen, wenn sie fehlerhaft wäre. Wenn der Info-Marker jedoch OK lautet, sollte er früh ausbrechen. Die Funktion handler
legt letztendlich fest, self.size
welche Abmessungen das Bild hat.
.open()
die gesamte Datei in den Speicher eingelesen wird ... (das ist was.load()
) - soweit ich weiß - das ist so gut wie es nur gehtPIL