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 08 Python
跟老齐学Python之for循环语句
Oct 02 Python
Python使用自带的ConfigParser模块读写ini配置文件
Jun 26 Python
Python内存读写操作示例
Jul 18 Python
python+unittest+requests实现接口自动化的方法
Nov 29 Python
python 产生token及token验证的方法
Dec 26 Python
Python综合应用名片管理系统案例详解
Jan 03 Python
Python 文件数据读写的具体实现
Jan 24 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
Python面向对象特殊属性及方法解析
Sep 16 Python
Python classmethod装饰器原理及用法解析
Oct 17 Python
python Polars库的使用简介
Apr 21 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实现将多个文件中的内容合并为新文件的方法示例
2017/06/10 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
JavaScript:Div层拖动效果实例代码
2013/08/06 Javascript
Function.prototype.bind用法示例
2013/09/16 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
Angular.js与Bootstrap相结合实现手风琴菜单代码
2016/04/13 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
深入理解JavaScript定时机制
2016/10/27 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
webpack打包react项目的实现方法
2018/06/21 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
python操作xml文件详细介绍
2014/06/09 Python
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
利用python将图片版PDF转文字版PDF
2019/05/03 Python
安装python依赖包psycopg2来调用postgresql的操作
2021/01/01 Python
CSS 说明横向进度条最后显示文字的实现代码
2020/11/10 HTML / CSS
简单的HTML5初步入门教程
2015/09/29 HTML / CSS
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
英国最大的在线床超市:Bed Star
2019/01/24 全球购物
学校课外活动总结
2014/05/08 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
女方离婚起诉书
2015/05/18 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书