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实现批量获取指定文件夹下的所有文件的厂商信息
Sep 28 Python
Python psutil模块简单使用实例
Apr 28 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
Jun 27 Python
python爬虫的数据库连接问题【推荐】
Jun 25 Python
python截取两个单词之间的内容方法
Dec 25 Python
python爬取微信公众号文章的方法
Feb 26 Python
python面向对象实现名片管理系统文件版
Apr 26 Python
pyqt5 删除layout中的所有widget方法
Jun 25 Python
python 环境搭建 及python-3.4.4的下载和安装过程
Jul 20 Python
python3 selenium自动化测试 强大的CSS定位方法
Aug 23 Python
python 安装impala包步骤
Mar 28 Python
Python切片列表字符串如何实现切换
Aug 06 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
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
php学习笔记 面向对象的构造与析构方法
2011/06/13 PHP
PHP写杨辉三角实例代码
2011/07/17 PHP
Drupal7中常用的数据库操作实例
2014/03/02 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
使用正则去除php代码中的注释方法
2016/11/03 PHP
JavaScript事件列表解说
2006/12/22 Javascript
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
Python 元类使用说明
2009/12/18 Python
利用python获得时间的实例说明
2013/03/25 Python
python实现数独算法实例
2015/06/09 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
关于numpy数组轴的使用详解
2019/12/05 Python
python类中super() 的使用解析
2019/12/19 Python
keras slice layer 层实现方式
2020/06/11 Python
如何教少儿学习Python编程
2020/07/10 Python
html5绘制时钟动画
2014/12/15 HTML / CSS
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
数控技术与应用毕业生自荐信
2013/09/24 职场文书
哈理工毕业生的求职信
2013/12/22 职场文书
网络信息管理员岗位职责
2014/01/05 职场文书
学生会招新策划书
2014/02/14 职场文书
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
Python自动化实战之接口请求的实现
2022/05/30 Python