首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Pillow:将图像渐进式保存到模型

Python Pillow:将图像渐进式保存到模型
EN

Stack Overflow用户
提问于 2015-08-02 16:39:02
回答 1查看 436关注 0票数 0

我之前问了一个关于pillow的相关问题。

Python Pillow: Make image progressive before sending to 3rd party server

只是扩展一下,当我上传图像并将其存储在服务器上时,我如何在图像中实现progressiveness

Models.py

代码语言:javascript
复制
class Blog(models.Model):
    banner = models.FileField("banner", upload_to='blog_banner', help_text='Upload blog banner', blank=True, null=True)

Forms.py

代码语言:javascript
复制
def clean(self):
        data = self.cleaned_data
        banner = data['banner']

        # Check and make banner image progressive
        if not Utils.is_progressive_img(banner):
            data['banner'] = Utils.make_progressive_img(banner)

渐进法

代码语言:javascript
复制
img = Image.open(source)
progressive_img = StringIO()
img.save(progressive_img, "JPEG", quality=80, optimize=True, progressive=True)

forms.py中,当我保存博客帖子时,我看到以下错误,我知道这是由于StringIO()的格式造成的

错误

代码语言:javascript
复制
AttributeError at /blog/create/
StringIO instance has no attribute '_committed'
EN

回答 1

Stack Overflow用户

发布于 2015-08-03 01:30:33

下面是我在forms.py中使用的解决方案

forms.py

代码语言:javascript
复制
def clean(self):
    data = self.cleaned_data
    banner = data['banner']

    # Blog banner has been changed, Check for if the new image is progressive?
    if self.instance.banner != banner and Utils.is_progressive_img(banner) is False:
        progressive_banner = Utils.make_progressive_img(img=banner, method=2)
        data['banner'].file = progressive_banner

   return data

您需要更新Django FileField.file属性

models.py

代码语言:javascript
复制
class Blog(models.Model):
    banner = models.FileField("banner", upload_to='blog_banner', help_text='Upload blog banner', blank=True, null=True)

更新

model.save()中实现相同的逻辑

代码语言:javascript
复制
if Utils.is_progressive_img(self.banner) is False:
     progressive_banner = Utils.make_progressive_img(img=self.banner, method=2)

     name = self.banner.name
     # Delete the current image & Add the new progressive image.
     self.banner.delete(save=False)
     self.banner.save(name,content=ContentFile(progressive_banner.getvalue()), save=False)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31770063

复制
相关文章

相似问题

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