无法正确克隆cStringIO对象

2 投票
1 回答
587 浏览
提问于 2025-04-19 01:36

我有一段代码,用来从一个网址获取图片:

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 保持未裁剪状态。

撰写回答