django在保存图像的同时压缩图像示例代码详解


Posted in Python onFebruary 11, 2020

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

from django.db import models
 
class Post(models.Model):
 text = models.TextField()
 image = models.ImageField(upload_to='images/')

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

使用Pillow压缩图像

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

from PIL import Image
im = Image.open('/some/path/to/image')
im.save('/desired/path/new_image_name.jpg', quality=70)
im.close()

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

利用Django signals

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

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

pre_save.connect(our_handler, sender=Post)

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

from django.dispatch import receiver
...
 
@receiver(pre_save, sender=Post)
def my_handler(sender, **kwargs):
 ...

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

from django.db.models.signals import pre_save
from django.dispatch import receiver
 
@receiver(pre_save, sender=Post)
def handle_image_compression(sender, instance, **kwargs):
 try:
  post_obj = Post.objects.get(pk=instance.pk)
 except Post.DoesNotExist:
  # the object does not exists, so compress the image
  instance.image = compress_image(instance.image)
 else:
  # the object exists, so check if the image field is updated
  if post_obj.image != instance.image:
   instance.image = compress_image(instance.image)

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

from PIL import Image
from io import BytesIO
from django.core.files import File
def compress_image(image):
 im = Image.open(image)
 out = BytesIO()
 im.save(out, 'JPEG', quality=70)
 compressed = File(out, name=image.name)
 im.close()
 return compressed

总结

以上所述是小编给大家介绍的django在保存图像的同时压缩图像示例代码详解,希望对大家有所帮助!

Python 相关文章推荐
总结Python中逻辑运算符的使用
May 13 Python
pymssql数据库操作MSSQL2005实例分析
May 25 Python
在Django的URLconf中使用命名组的方法
Jul 18 Python
python正则表达式之对号入座篇
Jul 24 Python
python+numpy按行求一个二维数组的最大值方法
Jul 09 Python
python3实现mysql导出excel的方法
Jul 31 Python
Python循环实现n的全排列功能
Sep 16 Python
PyTorch中topk函数的用法详解
Jan 02 Python
PyTorch中的Variable变量详解
Jan 07 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
May 26 Python
Pycharm学生免费专业版安装教程的方法步骤
Sep 24 Python
python的变量和简单数字类型详解
Sep 15 Python
Python中包的用法及安装
Feb 11 #Python
使用Python实现牛顿法求极值
Feb 10 #Python
关于TensorFlow新旧版本函数接口变化详解
Feb 10 #Python
TensorFlow 多元函数的极值实例
Feb 10 #Python
给 TensorFlow 变量进行赋值的方式
Feb 10 #Python
Python 中的pygame安装与配置教程详解
Feb 10 #Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 #Python
You might like
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
2011/08/12 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
js星星评分效果
2014/07/24 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
Node.js实现文件上传的示例
2017/06/28 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
jQuery length 和 size()区别总结
2018/04/26 jQuery
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
js实现div色块碰撞
2020/01/16 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
openlayers4.6.5实现距离量测和面积量测
2020/09/25 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
Python在Console下显示文本进度条的方法
2016/02/14 Python
关于Django外键赋值问题详解
2017/08/13 Python
python 图像处理画一个正弦函数代码实例
2019/09/10 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
django ORM之values和annotate使用详解
2020/05/19 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
欧洲著名的珠宝和手表网上商城:uhrcenter
2017/04/10 全球购物
中专毕业个人的自荐信格式
2013/09/21 职场文书
职高毕业生自我鉴定
2013/10/21 职场文书
洗煤厂厂长岗位职责
2014/01/03 职场文书
单位创先争优活动方案
2014/01/26 职场文书
预备党员政审材料
2014/02/04 职场文书
《尊严》教学反思
2014/02/11 职场文书
护士岗位职责
2014/02/16 职场文书
会计求职自荐信范文
2015/03/04 职场文书
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL