Pillow中的文件處理

2021-07-19 11:17 更新

以圖像形式打開文件時(shí),Pillow需要文件名、?pathlib.Path? 對(duì)象或類似文件的對(duì)象。Pillow使用文件名或 ?Path ?要打開一個(gè)文件,所以在本文的其余部分中,它們都將被視為一個(gè)類似文件的對(duì)象。

以下都是等效的:

from PIL import Image
import io
import pathlib

with Image.open('test.jpg') as im:
    ...

with Image.open(pathlib.Path('test.jpg')) as im2:
    ...

with open('test.jpg', 'rb') as f:
    im3 = Image.open(f)
    ...

with open('test.jpg', 'rb') as f:
    im4 = Image.open(io.BytesIO(f.read()))
    ...

如果將文件名或類似路徑的對(duì)象傳遞給 Pillow,則在?Image.Image.load()?調(diào)用該方法后,Pillow 打開的結(jié)果文件對(duì)象也可能被 Pillow 關(guān)閉 ,前提是關(guān)聯(lián)的圖像沒有多幀。

Pillow 通常不能關(guān)閉和重新打開文件,因此對(duì)該文件的任何訪問都需要在關(guān)閉之前進(jìn)行。

圖像生命周期

  • ?Image.open() ?文件名和 ?Path ?對(duì)象作為文件打開。從打開的文件中讀取元數(shù)據(jù)。文件保持打開狀態(tài)以供進(jìn)一步使用。
  • ?Image.Image.load()? 當(dāng)需要圖像中的像素?cái)?shù)據(jù)時(shí), load() 被調(diào)用。當(dāng)前幀被讀取到內(nèi)存中。該圖像現(xiàn)在可以獨(dú)立于底層圖像文件使用。
  • 如果將文件名或Path對(duì)象傳遞給Image.open(),則文件對(duì)象由 Pillow 打開,并被認(rèn)為是由 Pillow 獨(dú)占使用的。所以如果圖片是單幀圖片,這個(gè)方法會(huì)在讀取完該幀后關(guān)閉文件。如果圖像是多幀圖像(例如多頁 TIFF 和動(dòng)畫 GIF),圖像文件將保持打開狀態(tài),以便 Image.Image.seek()可以加載適當(dāng)?shù)膸?br>
  • ?Image.Image.close()?關(guān)閉文件并銷毀核心圖像對(duì)象。這用于 Pillow 上下文管理器支持。例如:
with Image.open('test.jpg') as img: ... # image operations here.

單幀圖像的生命周期相對(duì)簡(jiǎn)單。文件必須保持打開狀態(tài),直到 ?load()? 或 ?close()? 調(diào)用函數(shù)或退出上下文管理器。

多幀圖像更復(fù)雜。這個(gè)? load()? 方法不是終端方法,因此不應(yīng)關(guān)閉基礎(chǔ)文件。一般來說,在調(diào)用者明確關(guān)閉圖像之前, Pillow 不知道是否會(huì)有其他數(shù)據(jù)請(qǐng)求。

難題

  • ?TiffImagePlugin ?有一些代碼可以將底層文件描述符傳遞到libtiff中(如果處理的是實(shí)際文件)。由于libtiff在內(nèi)部關(guān)閉文件描述符,因此在將其傳遞到libtiff之前,它是重復(fù)的。
  • 關(guān)閉文件后,需要訪問文件的操作將失敗:
with open('test.jpg', 'rb') as f:
        im5 = Image.open(f)
im5.load() # FAILS, closed file 

with Image.open('test.jpg') as im6: 
        pass im6.load() # FAILS, closed file

建議的文件處理

  • ?Image.Image.load()? 應(yīng)該關(guān)閉圖像文件,除非有多個(gè)幀。
  • ?Image.Image.seek() ?不應(yīng)關(guān)閉圖像文件。
  • 庫的用戶應(yīng)使用上下文管理器或調(diào)用? Image.Image.close() ?在使用文件名或 ?Path ?對(duì)象以確保關(guān)閉基礎(chǔ)文件。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)