2014-08-31 102 views
2

我有下面的代碼從URL中獲得的圖像:無法複製cStringIO對象正確

im = cStringIO.StringIO(image_buffer) 

現在我有原來的圖像,例如在做不同的操作:

Image.open(im).crop(box=(1, 1, 1, 1) 

但是這會編輯im自身,所以我不能重用Image.open命令。

因此我想克隆im對象。我已嘗試使用以下:

copy.deepcopy(im) 
copy.copy(im) 
im[:] 

但這些都不似乎工作,複製者甚至會引發以下異常:

object.__new__(cStringIO.StringI) is not safe, use cStringIO.StringI.__new__() 

我試圖尋找這個錯誤,但它我不清楚它爲什麼拒絕克隆im對象。

這是用Python編寫的(使用Django框架)

我現在用的是PIL庫的圖像操作

回答

4

您可以創建一個cStringIO.StringIO文件對象的副本通過簡單地走出字符串值,並創建一個新的對象,使用StringIO.getvalue() method

new_file = cStringIO.StringIO(original.getvalue()) 

也就是說,存儲到圖像對象參考,而是和應用操作到:

image = Image.open(im) 
image.crop(box=(1, 1, 1, 1)) 

然後這允許您也應用所有轉換後保存圖像到一個新的文件(內存或其他)。

您可以更輕鬆地創建圖像對象的其他副本與Image.copy() method

image = Image.open(im) 
image_copy = image.copy() 
image.crop(box=(1, 1, 1, 1)) 

這裏image_copy仍然未裁剪。

+0

如何克隆圖像,然後當我使用最後一張圖片? – 2014-08-31 09:12:31

+0

@MaximGeerinck:使用'Image.copy()'方法。 – 2014-08-31 09:16:00

+0

謝謝,作品:) – 2014-08-31 09:16:29