无法正确克隆cStringIO对象

时间:2014-08-31 08:58:44

标签: python django python-imaging-library pillow

我有以下代码从网址获取图片:

im = cStringIO.StringIO(image_buffer)

现在我必须对原始图像执行不同的操作,例如:

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

但是这将编辑我自己,所以我不能重复使用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库进行图像处理

1 个答案:

答案 0 :(得分:4)

您可以使用StringIO.getvalue() method简单地输出字符串值并创建新对象来创建cStringIO.StringIO文件对象的副本:

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尚未解除。