Comme l'indiquent les commentaires, PIL ne charge pas l'image en mémoire lors de l'appel .open
. En regardant la documentation de PIL 1.1.7
, la docstring for .open
dit:
def open(fp, mode="r"):
"Open an image file, without loading the raster data"
Il y a quelques opérations sur les fichiers dans la source comme:
...
prefix = fp.read(16)
...
fp.seek(0)
...
mais ceux-ci ne constituent guère la lecture de l'ensemble du dossier. En fait, .open
renvoie simplement un objet fichier et le nom du fichier en cas de succès. De plus, les documents disent:
open (fichier, mode = "r")
Ouvre et identifie le fichier image donné.
C'est une opération paresseuse; cette fonction identifie le fichier, mais les données d'image réelles ne sont pas lues à partir du fichier tant que vous n'essayez pas de traiter les données (ou d'appeler la méthode de chargement ).
En creusant plus profondément, nous voyons que les .open
appels _open
sont une surcharge spécifique au format d'image. Chacune des implémentations à _open
peut être trouvée dans un nouveau fichier, par exemple. Les fichiers .jpeg sont au format JpegImagePlugin.py
. Examinons celui-ci en profondeur.
Ici, les choses semblent devenir un peu délicates, il y a une boucle infinie qui se rompt lorsque le marqueur jpeg est trouvé:
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")
Ce qui semble pouvoir lire tout le fichier s'il était mal formé. S'il lit le marqueur d'information OK, cependant, il devrait sortir tôt. La fonction handler
définit finalement self.size
quelles sont les dimensions de l'image.
.open()
lit le fichier entier en mémoire ... (c'est ce que.load()
) fait - donc pour autant que je sache - c'est aussi bon que possiblePIL