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实现压缩与解压gzip大文件的方法
Sep 18 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
Dec 12 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
Apr 11 Python
Python操作MySQL数据库的方法
Jun 20 Python
python3实现字符串操作的实例代码
Apr 16 Python
Python文件路径名的操作方法
Oct 30 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
Python如何通过Flask-Mail发送电子邮件
Jan 29 Python
利用python实现凯撒密码加解密功能
Mar 31 Python
python构造IP报文实例
May 05 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
python实现扫雷游戏的示例
Oct 20 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下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
PHP中通过trigger_error触发PHP错误示例
2015/06/23 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
2016/01/27 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
用PHP做了一个领取优惠券活动的示例代码
2019/07/05 PHP
js中将字符串转换成json的三种方式
2011/01/12 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
2013/08/19 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
[03:31]DOTA2英雄基础教程 大地之灵
2013/12/17 DOTA
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
对python的输出和输出格式详解
2018/12/08 Python
python使用插值法画出平滑曲线
2018/12/15 Python
python3 selenium自动化 frame表单嵌套的切换方法
2019/08/23 Python
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
党委书记岗位职责
2013/11/24 职场文书
医科大学毕业生自荐信
2014/02/03 职场文书
党员岗位承诺书
2014/03/25 职场文书
农行心得体会
2014/09/02 职场文书
邓小平理论心得体会
2014/09/09 职场文书
简单的辞职信怎么写
2015/02/28 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
房屋所有权证明
2015/06/19 职场文书
2016新年年会主持词
2015/07/06 职场文书
婚庆答谢词大全
2015/09/29 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书