【问题标题】:Scale Django ImageField before saving to disk在保存到磁盘之前缩放 Django ImageField
【发布时间】:2012-11-08 08:32:55
【问题描述】:

我想在模型保存到磁盘之前缩放 ImageField,但不知何故会得到一个不可读的图像。目标是在不将其保存到磁盘的情况下对其进行扩展。

这是我目前的尝试:

IMAGE_MAX_SIZE = 800, 800
class Picture(models.Model):
    ...
    image = models.ImageField(upload_to='images/%Y/%m/%d/')

    # img is a InMemoryUploadedFile, received from a post upload
    # removing the scale function results in a readable image
    def set_image(self, img):
        self.image = img
        self.__scale_image()

    def __scale_image(self):
        img = Image.open(StringIO(self.image.read()))
        img.thumbnail(IMAGE_MAX_SIZE, Image.ANTIALIAS)
        imageString = StringIO()
        img.save(imageString, img.format)
        self.image.file = InMemoryUploadedFile(imageString, None, self.image.name, self.image.file.content_type, imageString.len, None)

我没有收到错误,但生成的图像无法正确显示。任何想法如何纠正这个问题?

谢谢 西蒙

【问题讨论】:

    标签: python django python-imaging-library


    【解决方案1】:

    我很接近,但不完全在那里。此功能现在可以正常工作,并且图像在缩放期间的任何时候都不会保存到光盘中。

    IMAGE_MAX_SIZE = 800, 800
    class Picture(models.Model):
        ...
        image = models.ImageField(upload_to='images/%Y/%m/%d/')
    
        # img is a InMemoryUploadedFile, received from a post upload
        def set_image(self, img):
            self.image = img
            self.__scale_image(self.image, IMAGE_MAX_SIZE)
    
        def __scale_image(self, image, size):
            image.file.seek(0) # just in case
            img = Image.open(StringIO(image.file.read()))
            img.thumbnail(size, Image.ANTIALIAS)
            imageString = StringIO()
            img.save(imageString, img.format)
    
            # for some reason content_type is e.g. 'images/jpeg' instead of 'image/jpeg'
            c_type = image.file.content_type.replace('images', 'image')
            imf = InMemoryUploadedFile(imageString, None, image.name, c_type, imageString.len, None)
            imf.seek(0)
            image.save(
                    image.name,
                    imf,
                    save=False
                )
    

    【讨论】:

    • for some reason content_type is e.g. 'images/jpeg' instead of 'image/jpeg' 你能告诉我是什么原因吗? 'image/jpeg' 工作正常
    【解决方案2】:

    最好使用 sorl-thubnail。

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 2012-02-05
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多