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
猜你喜欢
- python清空命令行 !有时我们在命令行上运行一些代码时,觉得有些冗余了,可以通过以下代码进行清除命令行上的代码。import osdef
- nn.RNN(input_size, hidden_size, num_layers=1, nonlinearity=tanh, bias=
- 就服务器端处理而言,ASP是产生动态Web网页的一种相对较新的技术。动态页意味着什么呢?先暂时不考虑客户端相关功能上的进展,也不讨论客户端脚
- 众所周知,python文件读取文件的时候所支持的newlines(即换行符),是指定的。这一点不管是从python的doucuments上还
- 一、什么是域名系统DNS 计算机域名系统 (DNS) 是由解析器以及域名服务器组成的。当我们在上网的时候,通常输入的是网址,其实这就是一个域
- 今天网页调试的时候在线订单出现错误:Server 对象 错误 'ASP 0178
- 1.数组的索引我用的是iloc函数。导入数据是data,索引data.iloc[i,j],i代表行,j代表列。如果要索引i行之后的所有行元素
- 背景最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File R
- 本文实例讲述了Python3实现爬取简书首页文章标题和文章链接的方法。分享给大家供大家参考,具体如下:from urllib import
- 1.0 为什么要做这个博客站?在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满
- ie的javascript失效了,不是设置的问题那么就可能是以下几点问题了~安装KAV可能会破坏系统的javascript关联,失javas
- 解读pandas.DataFrame.corrwithpandas.DataFrame.corrwith用于计算DataFrame中行与行或
- python整数序列求和整数序列求和,用户输入一个正整数N,计算从1到N(包含1和N)相加之后的结果。代码如下:n=input("
- 进程的概念程序是没有运行的代码,静态的;进程是运行起来的程序,进程是一个程序运行起来之后和资源的总称;程序只有一个,但同一份程序可以有多个进
- 写代码时,我们希望把一些操作放到一个代码块中,这样在代码块中执行时就可以保持在某种运行状态,而当离开该代码块时就执行另一个操作,结束当前状态
- 前言很久以前的博客才发现,发布一下。这个系列以后有时间再做。arp攻击arp路由链表,感兴趣的自行百度,我的博客我的笔记.路由指向介绍两个东
- 1、使用函数shutil.make_archive()创建归档文件,并返回归档后的名称。import shutilpath_1 = r
- 这篇文章主要介绍了如何基于python生成list的所有的子集,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 在学习了一点 Python 基础之后,我们可以做一个罚点球的小游戏,大概流程是这样:每一轮,你先输入一个方向射门,然后电脑随机判断一个方向扑
- <HTML> <BODY> <