Comme les commentaires l'indiquent, l'IAP ne charge pas l'image en mémoire lorsqu'il appelle .open
. En regardant les docs de PIL 1.1.7
la docstring pour .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 cela ne constitue pas une lecture complète du fichier. En effet .open
renvoie simplement un objet fichier et le nom du fichier en cas de succès. En outre, la fonction docs dites :
open(fichier, mode="r")
Ouvre et identifie le fichier image donné.
Il s'agit d'une opération paresseuse ; cette fonction identifie le fichier, mais les données d'image réelles ne sont pas lues à partir du fichier jusqu'à ce que vous essayiez de traiter les données (ou appelez la fonction charge méthode).
En creusant davantage, nous constatons que .open
appelle _open
qui est une surcharge spécifique au format de l'image. Chacune des implémentations de _open
peuvent être trouvés dans un nouveau fichier, par exemple, les fichiers .jpeg sont en JpegImagePlugin.py
. Examinons-la en profondeur.
C'est là que les choses semblent devenir un peu délicates, car il y a une boucle infinie qui est interrompue 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 être pourrait lire le fichier entier s'il était malformé. En revanche, s'il lit le marqueur d'information correctement, il devrait s'échapper rapidement. La fonction handler
en fin de compte self.size
qui sont les dimensions de l'image.