Como os comentários aludem, PIL não carrega a imagem na memória ao chamar .open. Olhando para a documentação de PIL 1.1.7, a docstring para .opendiz:
def open(fp, mode="r"):
"Open an image file, without loading the raster data"
Existem algumas operações de arquivo na fonte, como:
...
prefix = fp.read(16)
...
fp.seek(0)
...
mas isso dificilmente constitui a leitura de todo o arquivo. Na verdade, .opensimplesmente retorna um objeto de arquivo e o nome do arquivo em caso de sucesso. Além disso, os documentos dizem:
aberto (arquivo, modo = ”r”)
Abre e identifica o arquivo de imagem fornecido.
Esta é uma operação preguiçosa; esta função identifica o arquivo, mas os dados da imagem real não são lidos do arquivo até que você tente processar os dados (ou chamar o método de carregamento ).
Indo mais fundo, vemos que as .openchamadas _opensão uma sobrecarga específica do formato de imagem. Cada uma das implementações _openpode ser encontrada em um novo arquivo, por exemplo. Arquivos .jpeg estão em JpegImagePlugin.py. Vamos dar uma olhada nisso em profundidade.
Aqui as coisas parecem ficar um pouco complicadas, nele há um loop infinito que é interrompido quando o marcador jpeg é encontrado:
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")
Parece que ele poderia ler todo o arquivo se estivesse malformado. Se ler o marcador de informações OK, no entanto, ele deve sair antes. A função, em handlerúltima análise, define self.sizequais são as dimensões da imagem.
.open()leia todo o arquivo na memória ... (isso é o que.load()) faz - pelo que eu sei - isso é o melhor que posso usarPIL