Yorumların ima ettiği gibi, PIL arama sırasında görüntüyü belleğe yüklemez .open
. Ait dokümanlar baktığımızda PIL 1.1.7
için docstring'ini .open
diyor ki:
def open(fp, mode="r"):
"Open an image file, without loading the raster data"
Kaynakta aşağıdaki gibi birkaç dosya işlemi vardır:
...
prefix = fp.read(16)
...
fp.seek(0)
...
ancak bunlar tüm dosyayı okumayı oluşturmaz. Aslında .open
, başarı durumunda bir dosya nesnesi ve dosya adını döndürür. Ek olarak, dokümanlar şunları söylüyor:
open (dosya, mod = ”r”)
Verilen görüntü dosyasını açar ve tanımlar.
Bu tembel bir işlemdir; bu işlev dosyayı tanımlar, ancak gerçek görüntü verileri, siz verileri işlemeye (veya yükleme yöntemini çağırmaya ) kadar dosyadan okunmaz .
Derin kazma, biz görüyoruz .open
çağrıları _open
bir görüntü formatlı özgü aşırı yük olduğunu. Uygulamaların her biri _open
yeni bir dosyada bulunabilir, örn. .jpeg dosyaları bulunmaktadır JpegImagePlugin.py
. Buna derinlemesine bakalım.
Burada işler biraz karmaşıklaşıyor gibi görünüyor, içinde jpeg işaretçisi bulunduğunda kırılan sonsuz bir döngü var:
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")
Hangisi gibi görünüyor olabilir o şekil bozukluğuna eğer tüm dosyayı okuyun. Ancak bilgi işaretini okursa, erken çıkması gerekir. İşlev, handler
nihayetinde self.size
görüntünün boyutları olan boyutları belirler .
.open()
bunun tüm dosyayı hafızaya okuduğuna inanmıyorum ... (bu.load()
) işe yarıyor - bildiğim kadarıyla - kullandığı kadar iyiPIL