首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Django-Cumulus以编程方式将图像保存到ImageField?

如何使用Django-Cumulus以编程方式将图像保存到ImageField?
EN

Stack Overflow用户
提问于 2012-06-15 16:22:07
回答 1查看 618关注 0票数 1

我正在使用Django-Cumulus将图像存储到Rackspace的Cloudfiles平台。

我想要动态地操作我的图像,并将它们保存为我的模型的新ImageField。例如,我有一个带有这些图像的照片模型:ImageFields,thumb_256x256

在我的表单的save()方法中,我让用户指定裁剪位置(使用JCrop)。

无论如何,我知道如何抓取用户上传的现有图像文件。我还知道如何使用PIL进行操作。我遇到的问题是创建一个新的Rackspace文件并写入它。

我一直收到异常"NoSuchObject“。

下面是一些示例代码:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-17 09:08:37

这是一个临时的解决方案。我在正确设置新文件名时遇到问题。它只是将一个_X附加到文件名中。例如,每当我保存一个新版本时,somefilename.jpg就变成了somefilename_1.jpg。

这段代码有点难看,但确实完成了工作。它会创建图像的裁剪版本,如果需要,还会生成缩略图。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11047051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档