使用django怎么实现在保存图像的同时压缩图像

  介绍

使用django怎么实现在保存图像的同时压缩图像?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

假设我们有一个非常简单的后模型,它将是一个图像及其描述,

得到django.db  import 模型   ,   class 职位(models.Model):=,,text  models.TextField ()=,,image  models.ImageField (upload_to=& # 39;图像/& # 39;)

但是我们要优化图像大小,这将由我们发布的图片字段指出。这样做有充分的理由——它有助于更快地加载网站/应用程序并减少我们的服务器存储。在使用Django之前,首先让我们简单介绍一下使用枕头进行图像压缩的概述。

<强>使用枕头压缩图像

枕头是用于图像相关操作的出色Python软件包。图像类带有用于图像io和操作的方法,图像。打开从文件路径或文件对象读取图像。图像类的保存方法将质量作为以jpg格式保存图像的可选参数,范围为1到95,此参数的默认值为75,并且设置质量大于95会导致图像尺寸大于原本的。

得到PIL  import 形象   我=,Image.open(& # 39;/一些/道路//图像# 39;)   im.save(& # 39;/想要/道路/new_image_name.jpg& # 39;,,质量=70)   im.close ()

使用质量参数不是减小大小的唯一方法,例如,您可以将其与调整图像大小相结合,以获得更小的图像尺寸。

<>强利用Django信号

信号允许某些发送者通知一组接收者已经采取了某些措施。

Django带有许多内置信号,目前,我们对django.db.models.signals。pre_save信号感兴趣,该信号将在调用模型的save()方法之前发送。要将处理程序连接到信号,有信号。连接方法。要将信号附加到特定的发送者(在我们的例子中是模型),我们必须给Signal.connect方法提供发送方参数,例如,将pre_save信号附加到我们的后模型(上面定义),如下所示:

<代码> pre_save。连接(our_handler,发送方=Post)

Django还提供了用于连接信号的接收器装饰器,这使代码更加惯用。因此,除了定义our_handler并进行连接之外,我们还可以将our_handler的定义修饰为

得到django.dispatch  import 接收机   …   ,   @receiver (pre_save,发送方=Post)   def  my_handler(发送者,* * kwargs):   ,……

现在,让我们完成处理程序以压缩图像。pre_save信号还将实例参数发送到处理程序函数,该函数对应于要保存的实际实例。当我们要检查字段是否已更新时,这特别有用,因为我们不想重复压缩图像。因此我们可以将处理程序功能设为

得到django.db.models.signals  import  pre_save   得到django.dispatch  import 接收器   ,   @receiver (pre_save,发送方=Post)   def  handle_image_compression(发送方,,,* * kwargs):   ,试一试:   时间=post_obj 才能;Post.objects.get (pk=instance.pk)   ,except  Post.DoesNotExist:   #才能,从而object  does  not 存在,so  compress 从而形象   时间=instance.image 才能;compress_image (instance.image)   ,其他的:   #才能,从而object 存在,,so  check  if 从而image  field  is 更新   if 才能;post_obj.image  !=, instance.image:   ,,instance.image =, compress_image (instance.image)

现在,我们的最后一项任务是编写compress_image函数,该函数将使用一个ImageField并返回一个ImageField,公益诉讼的形象。open()方法只能用于文件路径或文件对象。这是一个有趣的事实,它是ImageField的超类,它镜像了python API的文件,因此,我们可以像使用实际文件一样使用它。使用Image.open的问题已解决,但是形象。拯救呢?事实证明形象。保存可以将图像写入BytesIO对象,因此,我们压缩图像的功能将变为

得到PIL  import 形象   得到io  import  BytesIO   得到django.core.files  import 文件   def  compress_image(图片):   ,我=,Image.open(图片)=,,out  BytesIO ()   ,im.save (,, & # 39; jpeg # 39;,,质量=70)=,compressed 文件(,,名字=image.name)   ,im.close ()   ,return 压缩

关于使用django怎么实现在保存图像的同时压缩图像问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

使用django怎么实现在保存图像的同时压缩图像