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 相关文章推荐
linux环境下安装pyramid和新建项目的步骤
Nov 27 Python
python抓取网页内容示例分享
Feb 24 Python
Python中json格式数据的编码与解码方法详解
Jul 01 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
python opencv之分水岭算法示例
Feb 24 Python
python数据结构学习之实现线性表的顺序
Sep 28 Python
在Python中表示一个对象的方法
Jun 25 Python
基于Python实现船舶的MMSI的获取(推荐)
Oct 21 Python
pytorch-神经网络拟合曲线实例
Jan 15 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
详解python的异常捕获
Mar 03 Python
Django中celery的使用项目实例
Jul 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
php中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
PHP中Session引起的脚本阻塞问题解决办法
2014/04/08 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
js表格分页实现代码
2009/09/18 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
你必须知道的Javascript知识点之"深入理解作用域链"的介绍
2013/04/23 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
2016/09/24 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
详解如何理解vue的key属性
2019/04/14 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
python利用hook技术破解https的实例代码
2013/03/25 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
python简易远程控制单线程版
2018/06/20 Python
Python中 CSV格式清洗与转换的实例代码
2019/08/29 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
迪奥美国官网:Dior美国
2019/12/07 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
UDP协议功能
2013/01/06 面试题
物流合作计划书
2014/01/10 职场文书
求职信名称怎么写
2014/05/26 职场文书
2014年文秘工作总结
2014/11/25 职场文书
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js
Windows11里微软已经将驱动程序安装位置A盘删除
2021/11/21 数码科技
css3带你实现3D转换效果
2022/02/24 HTML / CSS
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript