Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django使用枕头以不同格式保存图像_Django_Image_Format_Python Imaging Library - Fatal编程技术网

Django使用枕头以不同格式保存图像

Django使用枕头以不同格式保存图像,django,image,format,python-imaging-library,Django,Image,Format,Python Imaging Library,我有这个网站,我为我的学校,我需要优化它,像很多 因此,我决定以下一代格式(如jpeg-2000和webp)提供所有压缩图像。使用枕头,这是我目前所拥有的: class Bulletin(models.Model): banner = models.ImageField(upload_to='banner/', blank=True) def save(self, *args, **kwargs): super().save() if sel

我有这个网站,我为我的学校,我需要优化它,像很多

因此,我决定以下一代格式(如jpeg-2000和webp)提供所有压缩图像。使用枕头,这是我目前所拥有的:

class Bulletin(models.Model):
     banner = models.ImageField(upload_to='banner/', blank=True)

     def save(self, *args, **kwargs):
        super().save()
        if self.banner:
            thumbnail = Image.open(self.banner.path)
            resized = thumbnail.resize((1280, 620))
            resized.save(self.banner.path, quality=60)
因此,我认为这压缩了图像(请告诉我,如果我在上面的代码中犯了错误)

因此,现在我希望能够以多种格式保存此图像我希望上传的图像以以下格式保存:

  • webp
  • jpeg2000
  • jpeg
我正在考虑在我的模型横幅上创建更多的字段,比如字段
横幅\u webp
,然后我会将其转换为webp,在保存期间,我会将转换后的图像保存到该字段


问题是,我不知道如何使用枕头转换图像,或者如何执行我的要求。谢谢你的帮助。

约翰已经找到了一个可行的解决方案。我建议对此进行以下修改:

  • 假设公告中还有一些字段可能会在不更改横幅的情况下更改:您不需要在公告的每个
    save()
    上重新编码图像。如果您将编码放入自己的函数中,您可以在upload视图中专门调用该函数,如果这是代码中唯一修改此值的地方。在
    save()
    中检测字段是否已更改,因此这也是一个选项
  • 如果保留自定义的
    save()
    方法:应在
    super
    调用中传递参数:
    super().save(*args,**kwargs)
  • 您不需要删除旧的扩展名:您可以将图像命名为“whatever.jpg.webp”。它不会混淆计算机,我认为这个名称非常清楚地表明它是对原始文件的重新编码。此外,这允许您保持原始文件的原样,以防有一天您决定使用其他一些参数(例如,使用不同的质量设置)对图像进行编码
  • 对重新编码的图像文件路径有一个统一的访问器可以防止一些与打字错误相关的错误
课程公告(models.Model):
BANNER_REENCODE_FORMATS=[“jpg”、“jp2”、“webp”]
banner=models.ImageField(上传到='banner/',blank=True)
定义重新编码的标题路径(self,file\u format=“jpg”):
以self.BANNER\u重新编码\u格式断言文件\u格式
返回self.banner.path+“+”文件\u格式
def重新编码_横幅(自我):
image=image.open(self.banner.path)。转换(“RGB”)。调整大小((1280620))
对于self.BANNER\u重新编码\u格式的扩展:
image.save(自我重新编码的标题路径(扩展名),质量=60)
使用以下模板标记:

@register.filter(name='reencoded\u banner\u path')
@细滤器
def重新编码的条幅路径(公告,格式):
返回公告。重新编码的标题路径(格式)
您可以在模板中使用此选项:

{{公告|重新编码_banner_路径:“webp”}

请注意,您可能希望在上载图像时使用一些重命名逻辑,以便在用户上载两个文件名相同的文件时不会出现中断。

如果我的赏金不清楚,很抱歉,我想知道如何使用django以多种格式保存图像。谢谢。我想你没有读枕头文档。它具有您提到的两种格式(JPEG 2000和WebP),尽管还有一些附加的依赖项@阿齐布·巴希尔,我的问题措辞错误。我想将用户上传的图像转换为webp、jpeg2000和jpeg。我知道Pillow具有两种格式的功能。使用Pillow的“转换”应该只是加载和保存一种新格式。看看:用扩展名为“jpeg”或“webp”的文件名调用它就足够了。这是你想要的吗?然后我会加上它作为答案。哦,好的,谢谢!还有重命名逻辑部分,是的,我已经有了一些逻辑设置。嗨,伙计们。我尝试过这个,但是我需要你提到的重命名逻辑的帮助。我认为最好是为这个问题提出一个新的问题