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使用urllib模块和pyquery实现阿里巴巴排名查询
Jan 16 Python
将Python代码打包为jar软件的简单方法
Aug 04 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
详解Python中的相对导入和绝对导入
Jan 06 Python
python机器学习之KNN分类算法
Aug 29 Python
python 限制函数执行时间,自己实现timeout的实例
Jan 12 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
Django REST framework 单元测试实例解析
Nov 07 Python
Python魔法方法 容器部方法详解
Jan 02 Python
keras得到每层的系数方式
Jun 15 Python
详解Django ORM引发的数据库N+1性能问题
Oct 12 Python
Python实现我的世界小游戏源代码
Mar 02 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分页类
2013/10/26 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
jQuery下通过$.browser来判断浏览器.
2011/04/05 Javascript
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
JavaScript学习笔记之定时器
2015/01/22 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
2016/05/31 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
[01:21:36]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[41:21]夜魇凡尔赛茶话会 第三期02:看图识人
2021/03/11 DOTA
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
2018/04/27 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
2020/10/30 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
海外淘书首选:AbeBooks
2017/07/31 全球购物
捷克领先的户外服装及配件市场零售商:ALPINE PRO
2018/01/09 全球购物
Unix如何在一行中运行多个命令
2015/05/29 面试题
环境科学专业个人求职信
2013/12/15 职场文书
英语简历自我评价
2014/01/26 职场文书
捐助倡议书范文
2014/04/15 职场文书
村容村貌整治方案
2014/05/21 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
党员志愿者活动方案
2014/08/28 职场文书
2015年中个人总结范文
2015/03/10 职场文书
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis
win10搭建配置ftp服务器的方法
2022/08/05 Servers