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画出三角形外接圆和内切圆的方法
Jan 25 Python
Python3.6简单的操作Mysql数据库的三个实例
Oct 17 Python
使用11行Python代码盗取了室友的U盘内容
Oct 23 Python
使用python3构建文件传输的方法
Feb 13 Python
Python基础学习之类与实例基本用法与注意事项详解
Jun 17 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
关于PyTorch 自动求导机制详解
Aug 18 Python
pytorch标签转onehot形式实例
Jan 02 Python
在keras中实现查看其训练loss值
Jun 16 Python
python中id函数运行方式
Jul 03 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 Python
python 判断字符串当中是否包含字符(str.contain)
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
简单易用的计数器(数据库)
2006/10/09 PHP
PHP开发不能违背的安全规则 过滤用户输入
2011/05/01 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
2015/09/11 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
2016/07/06 Javascript
js在ie下打开对话窗口的方法小结
2016/10/24 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
详解小程序BackgroundAudioManager踩坑之旅
2019/12/08 Javascript
[00:12]DAC2018 天才少年转战三号位,他的SOLO是否仍如昔日般强大?
2018/04/06 DOTA
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
python使用arcpy.mapping模块批量出图
2017/03/06 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
2018/08/30 Python
对python 通过ssh访问数据库的实例详解
2019/02/19 Python
浅析Python的命名空间与作用域
2020/11/25 Python
python实现xml转json文件的示例代码
2020/12/30 Python
通用的Django注册功能模块实现方法
2021/02/05 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
澳大利亚购买最佳炊具品牌网站:Cookware Brands
2019/02/16 全球购物
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
幼儿园教师工作感言
2014/02/15 职场文书
《陶罐和铁罐》教学反思
2014/02/19 职场文书
小学“向国旗敬礼”网上签名寄语活动总结
2014/09/27 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
茶花女读书笔记
2015/06/29 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
图神经网络GNN算法
2022/05/11 Python
Flink 侧流输出源码示例解析
2022/09/23 Servers