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 subprocess模块学习总结
Mar 13 Python
Python简单获取自身外网IP的方法
Sep 18 Python
pandas series序列转化为星期几的实例
Apr 11 Python
python2与python3的print及字符串格式化小结
Nov 30 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
Django MEDIA的配置及用法详解
Jul 25 Python
Python简易版停车管理系统
Aug 12 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
django连接mysql数据库及建表操作实例详解
Dec 10 Python
Python selenium文件上传下载功能代码实例
Apr 13 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
Jun 12 Python
Opencv+Python识别PCB板图片的步骤
Jan 07 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
数据库中排序的对比及使用条件详解
2012/02/23 PHP
PHP 读取和编写 XML
2014/11/19 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
网页自动跳转代码收集
2009/09/27 Javascript
jquery 事件执行检测代码
2009/12/09 Javascript
jQuery find和children方法使用
2011/01/31 Javascript
在浏览器窗口上添加遮罩层的方法
2012/11/12 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
javascript实现右侧弹出“分享到”窗口效果
2016/02/01 Javascript
自动适应iframe右边的高度
2016/12/22 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
新手如何快速理解js异步编程
2019/06/24 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
JS轮播图的实现方法2
2020/08/25 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
收藏!10个免费高清视频素材网站!【设计、视频剪辑必备】
2021/03/18 杂记
eBay奥地利站:eBay.at
2019/07/24 全球购物
经典c++面试题四
2015/05/14 面试题
高三自我鉴定怎么写
2013/10/19 职场文书
毕业生自荐书
2013/12/18 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
退税申请报告怎么写
2015/05/18 职场文书
golang中的空接口使用详解
2021/03/30 Python
Python学习之时间包使用教程详解
2022/03/21 Python