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 .open
diz:
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, .open
simplesmente 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 .open
chamadas _open
são uma sobrecarga específica do formato de imagem. Cada uma das implementações _open
pode 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.size
quais 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