Як натякають коментарі, PIL не завантажує зображення в пам'ять під час дзвінка .open
. Дивлячись на документи PIL 1.1.7
, docstring для .open
говорить:
def open(fp, mode="r"):
"Open an image file, without loading the raster data"
У джерелі є кілька файлових операцій, таких як:
...
prefix = fp.read(16)
...
fp.seek(0)
...
але вони навряд чи є читанням всього файлу. Насправді .open
просто повертає файловий об’єкт та ім’я файлу на успіх. Крім того, документи говорять:
відкрити (файл, режим = ”r”)
Відкриває та ідентифікує даний файл зображення.
Це лінива операція; ця функція ідентифікує файл, але фактичні дані зображення не зчитуються з файлу, поки ви не спробуєте обробити дані (або зателефонувати за методом завантаження ).
Копаючи глибше, ми бачимо, що .open
дзвінки _open
є перевантаженням у форматі зображення. Кожну з реалізацій _open
можна знайти в новому файлі, наприклад. Файли .jpeg є в JpegImagePlugin.py
. Подивимось на це поглиблено.
Тут здається, що дещо стає складним, в ньому є нескінченний цикл, який виривається, коли маркер 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")
Як виглядає, він міг би прочитати весь файл, якщо він був неправильним. Якщо він зчитує інформаційний маркер ОК, він повинен вибухнути рано. Функція в handler
кінцевому підсумку встановлює, self.size
які є розміри зображення.
.open()
читає весь файл в пам'ять ... (саме це.load()
) робить - наскільки я знаю - це так добре, як це отримує використанняPIL