2016-01-13 60 views
0
from PIL import Image 

myImg = request.FILES['docfile'] 
myImg = Image.open(myImg) 
print(myImg.format, myImg.size, myImg.mode) 
myImg = myImg.resize((50, 50)) 
print(myImg.format, myImg.size, myImg.mode) 

以下是(django/python 3.5)代碼的刪節版本。目標是調整圖像大小(我不想爲此使用縮略圖),但將其保存在內存中,而不是將其保存到磁盤(因爲我必須將其傳回到陣列中)。在使用PIL調整大小時丟失圖像格式

無論如何,這裏有2頁打印的結果:

PNG (1300, 1300) RGBA 
None (50, 50) RGBA 

正如你所看到的,格式調整大小後丟失。我該如何保存它?

回答

2

作爲DOC says

PIL.Image.format

源文件的文件格式。對於庫本身創建的圖像 (通過工廠功能或通過在現有圖像上運行 方法),此屬性設置爲None

在調整圖像大小後,它會變成「由庫創建」,因此如果要保留該格式,則必須明確地執行此操作。

另請注意,格式是源文件的屬性,而不是圖像本身。圖像本身只是以某種方式存儲在內存中的一組抽象像素。因此,詢問圖片的格式是什麼沒有意義。詢問包含圖像的文件的格式是什麼意思。因此,只有將圖像寫入文件(或爲此編碼爲某種格式),圖像才具有格式。

+0

如果您使用的是原來的Python成像模塊,而不是枕頭叉,鏈接到文檔http://www.effbot.org/ imagebook/image.htm#tag-Image.Image.format – mpursuit

+0

好的謝謝你的回答。我如何將圖像編碼回PNG?強制格式爲PNG的確顯示了「PNG」,但圖像仍然是樣式而不是「imagename.png」。有沒有辦法在內存中做到這一點? –

+0

@RobertBrax呃,你必須在其上調用'.save(output,format ='PNG')'。如果你想保存到內存中,我想你應該嘗試將''BytesIO'](https://docs.python.org/2/library/io.html#io.BytesIO)作爲'output'而不是真正的文件。 – kirelagin

0

因爲我記得FILES集合中的項目就像流,即一旦讀取,您必須重新設置位置。例如,您可以將內容加載到StringIO對象,然後從中創建圖像,然後調用seek(0)並再次從該對象創建縮略圖。

0

爲了保存格式,你可以這樣做:

myImg = Image.open(myImg) 
myImg2 = myImg.resize((50, 50)) 
myImg2.format = myImg.format 
相關問題