Như các ý kiến ám chỉ, PIL không tải hình ảnh vào bộ nhớ khi gọi .open
. Nhìn vào tài liệu của PIL 1.1.7
, chuỗi tài liệu cho .open
biết:
def open(fp, mode="r"):
"Open an image file, without loading the raster data"
Có một số thao tác tệp trong nguồn như:
...
prefix = fp.read(16)
...
fp.seek(0)
...
nhưng những điều này hầu như không cấu thành việc đọc toàn bộ tệp. Trong thực tế, .open
chỉ cần trả về một đối tượng tệp và tên tệp khi thành công. Ngoài ra, các tài liệu nói:
mở (tệp, chế độ = ”r”)
Mở và xác định tệp hình ảnh đã cho.
Đây là một hoạt động lười biếng; chức năng này xác định tệp, nhưng dữ liệu hình ảnh thực tế không được đọc từ tệp cho đến khi bạn cố gắng xử lý dữ liệu (hoặc gọi phương thức tải ).
Tìm hiểu sâu hơn, chúng ta thấy rằng .open
các cuộc gọi _open
là một quá tải cụ thể ở định dạng hình ảnh. Mỗi triển khai _open
có thể được tìm thấy trong một tệp mới, ví dụ. tệp .jpeg có trong JpegImagePlugin.py
. Hãy xem xét vấn đề đó một cách sâu sắc.
Ở đây mọi thứ dường như trở nên phức tạp một chút, trong đó có một vòng lặp vô hạn bị phá vỡ khi tìm thấy điểm đánh dấu 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")
Có vẻ như nó có thể đọc toàn bộ tệp nếu nó không đúng định dạng. Tuy nhiên, nếu nó đọc đánh dấu thông tin OK, nó sẽ bùng phát sớm. handler
Cuối cùng, hàm thiết lập self.size
các kích thước của hình ảnh.
.open()
đọc toàn bộ tệp vào bộ nhớ ... (đó là những gì.load()
) làm - theo như tôi biết - điều này tốt như nó được sử dụngPIL