django在保存图像的同时压缩图像示例代码详解
作者:mindg.cn 发布时间:2021-09-21 15:42:46
假设我们有一个非常简单的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在保存图像的同时压缩图像示例代码详解,希望对大家有所帮助!
来源:https://www.mindg.cn/?p=2484&utm_source=tuicool&utm_medium=referral


猜你喜欢
- 一、时间获取函数>>> import time>>> time.time()1570530861.740
- 本文实例讲述了微信扫码支付模式。分享给大家供大家参考,具体如下:背景:因为微信占据众多的用户群,作为程序开发,自然而然也成了研究的重点。毕竟
- 我就废话不多说了,大家还是直接看代码吧!#加载keras模块from __future__ import print_functionimp
- 为了提高Asp程序的性能,人们常常将经常使用的数据缓存在 Application,但是你修改了数据库后怎么让application更新呢,本
- 思路:创建文件时,先检查是否有同名文件(使用os.path.isfile),如果有,则在文件名后加上编号n来创建。关键点:1. 使用os.p
- 使用session保持用户登陆连接在 view 中 login() 视图函数里增加如下语句不允许重复登录语句if request.sessi
- 问题描述最近产品提出一个需求,说是做表格呈现统计数据,不过数据源是来自两个地方的,所以需要做两个表格去呈现数据,同时在表格最后统计数据。效果
- 调用opencv库,将yuv图像转为jpg图像。代码如下:# define _CRT_SECURE_NO_WARNINGS#include
- 如下所示:#保存 cookie 到变量import urllib.requestimport http.cookiejarcookie =
- 利用函数:group_concat(),实现一个ID对应多个名称时,原本为多行数据,把名称合并成一行。 其完整语法: GROUP_CONCA
- 句柄(handle)是C++程序设计中经常提及的一个术语。它并不是一种具体的、固定不变的数据类型或实体,而是代表了程序设计中的一个广义的概念
- 一:背景引入对于一张图片,怎样修改局部像素值?二:利用Tensor方法比如输入全零tensor,可认为为黑色图片>>> n
- 前文介绍了Oracle 中实现数据透视表的几种方法,今天我们来看看在 MySQL/MariaDB 中如何实现相同的功能。本文使用的示例数据可
- python2.7中 集成了json的处理(simplejson),但在实际应用中,从mysql查询出来的数据,通常有日期格式,这时候,会报
- 今天下载了一个msde2000A,本想按照平时的安装习惯,找到了setup.exe安装程序,错误提示弹出一个对话框:“为了安全起见,要求使用
- 找遍资料得出结果:不能 不过同时也找到了解决办法,就是用iframe的方式来提交表单,即实现无刷新提交表单又可以上传文件! 一、HTML代码
- 今天和某朋友聊天,谈到他们公司的一个小问题。如下:表A设备表,存储MAC地址,省份,城市,区。表B软件表,存储MAC地址,软件名字。功能是可
- ipython简介ipython他是一个非常流行的python解释器,相比于原生的python解释器,有太多优点和长处,因此几乎是pytho
- MySQL的SQRT函数是用来计算出任何数量的平方根。可以使用SELECT语句找出方检定根的任意数如下:mysql> select S
- 上次版本如果在没有找到轮廓或轮廓的点集数很小无法拟合椭圆或在RANSAC中寻找最优解时会死循环中,优化后的代码import cv2impor