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中的len()函数的使用
Apr 07 Python
Python中使用pprint函数进行格式化输出的教程
Apr 07 Python
Python代码调试的几种方法总结
Apr 15 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
Django实现全文检索的方法(支持中文)
May 14 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
python 将字符串中的数字相加求和的实现
Jul 18 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
Jan 08 Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 Python
安装python依赖包psycopg2来调用postgresql的操作
Jan 01 Python
Python绘制地图神器folium的新人入门指南
May 23 Python
Python进程池与进程锁之语法学习
Apr 11 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
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
浅谈PHP中output_buffering
2015/07/13 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
小程序组件之仿微信通讯录的实现代码
2018/09/12 Javascript
微信小程序实现留言板功能
2018/11/02 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
详解实现vue的数据响应式原理
2021/01/20 Vue.js
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
python django下载大的csv文件实现方法分析
2019/07/19 Python
Pandas —— resample()重采样和asfreq()频度转换方式
2020/02/26 Python
Django中的session用法详解
2020/03/09 Python
python多线程实现同时执行两个while循环的操作
2020/05/02 Python
python3.7+selenium模拟淘宝登录功能的实现
2020/05/26 Python
Python reques接口测试框架实现代码
2020/07/28 Python
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
基于HTML5的WebSocket的实例代码
2018/08/15 HTML / CSS
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
荷叶母亲教学反思
2014/04/30 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
经典爱情感言
2015/08/03 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB