2014-08-31 98 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