无法正确克隆cStringIO对象
我有一段代码,用来从一个网址获取图片:
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 个回答
4
你可以通过获取一个 cStringIO.StringIO
文件对象的字符串值,然后创建一个新的对象来复制它,使用 StringIO.getvalue()
方法:
new_file = cStringIO.StringIO(original.getvalue())
不过,建议你保存一个对 图像对象 的引用,然后对这个对象进行操作:
image = Image.open(im)
image.crop(box=(1, 1, 1, 1))
这样,你就可以在应用了所有变换后,将图像保存到一个新的文件中(可以是内存中的文件,也可以是其他地方的文件)。
你可以更轻松地使用 Image.copy()
方法 来创建图像对象的额外副本:
image = Image.open(im)
image_copy = image.copy()
image.crop(box=(1, 1, 1, 1))
在这里,image_copy
保持未裁剪状态。