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 相关文章推荐
Python3中的2to3转换工具使用示例
Jun 12 Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 Python
Mac中Python 3环境下安装scrapy的方法教程
Oct 26 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
深度辨析Python的eval()与exec()的方法
Mar 26 Python
完美解决python3.7 pip升级 拒绝访问问题
Jul 12 Python
用django设置session过期时间的方法解析
Aug 05 Python
Python3简单爬虫抓取网页图片代码实例
Aug 26 Python
python 表格打印代码实例解析
Oct 12 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
PyTorch 如何自动计算梯度
May 23 Python
Python如何解决secure_filename对中文不支持问题
Jul 16 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
PHP模板引擎SMARTY
2006/10/09 PHP
PHP与MySQL开发中页面乱码的产生与解决
2008/03/27 PHP
ThinkPHP中U方法的使用浅析
2014/06/13 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
mysql desc(DESCRIBE)命令实例讲解
2016/09/24 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
Vue中key的作用示例代码详解
2020/06/10 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
Python遍历目录中的所有文件的方法
2016/07/08 Python
使用C++扩展Python的功能详解
2018/01/12 Python
Python内建模块struct实例详解
2018/02/02 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
Django数据结果集序列化并展示实现过程
2020/04/22 Python
Python爬取12306车次信息代码详解
2020/08/12 Python
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
大四学年自我鉴定
2013/11/13 职场文书
技能比赛获奖感言
2014/02/14 职场文书
人事专员工作职责
2014/02/22 职场文书
应届毕业生自荐信例文
2014/02/26 职场文书
《石榴》教学反思
2014/03/02 职场文书
母婴店促销方案
2014/03/05 职场文书
应届毕业生求职信
2014/05/26 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android