我有以下代码来从网址获取图像:
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 库进行图像操作
最佳答案
您可以通过简单地获取字符串值并使用 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
保持未裁剪状态。
关于python - 无法正确克隆 cStringIO 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25590456/