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模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
Aug 23 Python
Python实现进程同步和通信的方法
Jan 02 Python
Python批处理更改文件名os.rename的方法
Oct 26 Python
详解如何在Apache中运行Python WSGI应用
Jan 02 Python
python生成requirements.txt的两种方法
Sep 18 Python
Python中url标签使用知识点总结
Jan 16 Python
Python 识别12306图片验证码物品的实现示例
Jan 20 Python
Python集合操作方法详解
Feb 09 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
Feb 28 Python
基于Python爬虫采集天气网实时信息
Jun 05 Python
Python实现异步IO的示例
Nov 05 Python
Python爬取英雄联盟MSI直播间弹幕并生成词云图
Jun 01 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
完善CodeIgniter在IDE中代码提示功能的方法
2014/07/19 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
JavaScript的eval JSON object问题
2009/11/15 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
js获取内联样式的方法
2015/01/27 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
wxPython中文教程入门实例
2014/06/09 Python
Python创建日历实例
2014/08/21 Python
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
Python重新加载模块的实现方法
2018/10/16 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
Python各种扩展名区别点整理
2020/02/27 Python
Python实时监控网站浏览记录实现过程详解
2020/07/14 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
.net笔试题
2014/03/03 面试题
数控技术应用个人求职信范文
2014/02/03 职场文书
应届毕业生通用的自荐书范文
2014/02/07 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
企业挂职心得体会
2014/09/10 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技