Como aluden los comentarios, PIL no carga la imagen en la memoria al llamar .open
. Mirando los documentos de PIL 1.1.7
, la cadena de documentos para .open
dice:
def open(fp, mode="r"):
"Open an image file, without loading the raster data"
Hay algunas operaciones de archivo en la fuente como:
...
prefix = fp.read(16)
...
fp.seek(0)
...
pero estos difícilmente constituyen la lectura de todo el expediente. De hecho, .open
simplemente devuelve un objeto de archivo y el nombre de archivo en caso de éxito. Además, los documentos dicen:
abrir (archivo, modo = "r")
Abre e identifica el archivo de imagen dado.
Esta es una operación perezosa; esta función identifica el archivo, pero los datos de la imagen real no se leen del archivo hasta que intente procesar los datos (o llamar al método de carga ).
Profundizando, vemos que las .open
llamadas _open
son una sobrecarga específica del formato de imagen. Cada una de las implementaciones _open
se puede encontrar en un nuevo archivo, por ejemplo. Los archivos .jpeg están en formato JpegImagePlugin.py
. Veamos eso en profundidad.
Aquí las cosas parecen ponerse un poco complicadas, hay un bucle infinito que se rompe cuando se encuentra el marcador 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")
Lo que parece que podría leer todo el archivo si estuviera mal formado. Sin embargo, si lee bien el marcador de información, debería aparecer temprano. La función determina en handler
última instancia self.size
cuáles son las dimensiones de la imagen.
.open()
lea todo el archivo en la memoria ... (eso es lo que.load()
) hace, hasta donde yo sé, esto es tan bueno como se usaPIL