我正在使用Django-Cumulus将图像存储到Rackspace的Cloudfiles平台。
我想动态地操作我的图像并将它们保存为我的模型的新ImageField。例如,我有一个带有这些ImageFields的Photo模型:image,thumb_256x256
在我的Form的save()方法中,我让用户指定裁剪位置(使用JCrop)。
无论如何,我知道如何获取用户上传的现有图像文件。我也知道如何使用PIL进行操作。我遇到的问题是创建一个新的Rackspace文件并写入它。
我一直得到异常“NoSuchObject”。
以下是一些示例代码:
def save(self, commit=True):
""" Override the Save method to create a thumbnail of the image. """
m = super(PhotoUpdateForm, self).save(commit=False)
image = Image.open(m.image.file)
image.thumbnail((256,256), Image.ANTIALIAS)
thumb_io = CloudFilesStorageFile(storage=CLOUDFILES_STORAGE, name='foo/bar/test.jpg')
image.save(thumb_io.file, format='JPEG')
此外,一旦我达到这一点 - 将此图像设置为模型的其他ImageField的最佳方法是什么? (在我的情况下是m.thumb_256x256)
先谢谢!
更新:我正在使用的实际Cloudfiles Django应用程序的名称是“django-cumulus”
答案 0 :(得分:0)
这是一个临时解决方案。我遇到了正确设置新文件名的问题。它只是将_X附加到文件名。例如,每当我保存新版本时,somefilename.jpg就会变成somefilename_1.jpg。
这段代码有点难看但确实完成了工作。它会创建图像的裁剪版本,并在需要时生成缩略图。
def save(self, commit=True):
""" Override the Save method to create a thumbnail of the image. """
m = super(PhotoUpdateForm, self).save(commit=False)
# Cropped Version
if set(('x1', 'x2', 'y1', 'y2')) <= set(self.cleaned_data):
box = int(self.cleaned_data['x1']), \
int(self.cleaned_data['y1']), \
int(self.cleaned_data['x2']), \
int(self.cleaned_data['y2'])
image = Image.open(m.image.file)
image = image.crop(box)
temp_file = NamedTemporaryFile(delete=True)
image.save(temp_file, format="JPEG")
m.image.save("image.jpg", File(temp_file))
cropped = True # Let's rebuild the thumbnail
# 256x256 Thumbnail
if not m.thumb_256x256 or cropped:
if not image:
image = Image.open(m.image.file)
image.thumbnail((256,256), Image.ANTIALIAS)
temp_file = NamedTemporaryFile(delete=True)
image.save(temp_file, format="JPEG")
m.thumb_256x256.save("thumbnail.jpg", File(temp_file))
if commit: m.save()
return m