在django上无损压缩图像

2024-06-24

我正在做优化,Google 建议对图像进行无损压缩,正在寻找一种在 Django 中实现这一点的方法。

这是他们指定的图像,我认为为了有效地完成它,需要在系统范围内实现,可能使用中间件类,想知道以前是否有人这样做过。这是谷歌页面速度分析的链接https://developers.google.com/speed/pagespeed/insights/?url=www.kenyabuzz.com https://developers.google.com/speed/pagespeed/insights/?url=www.kenyabuzz.com

优化图像 正确格式化和压缩图像可以节省许多字节的数据。 优化以下图像,使其大小减少 627.3KiB(减少 74%)。

Losslessly compressing http://www.kenyabuzz.com/media/uploads/clients/kenya_buzz_2.jpg could save 594.3KiB (92% reduction).
Losslessly compressing http://www.kenyabuzz.com/media/uploads/clients/new_tribe_2.jpg could save 25KiB (44% reduction).
Losslessly compressing http://www.kenyabuzz.com/…a/uploads/clients/EthiopianAirlines2.jpg could save 3KiB (22% reduction).
Losslessly compressing http://www.kenyabuzz.com/static/kb/images/Nightlife.Homepage.jpg could save 1.3KiB (2% reduction).
Losslessly compressing http://www.kenyabuzz.com/static/kb/img/social/blog.png could save 1.1KiB (43% reduction).
Losslessly compressing http://www.kenyabuzz.com/static/kb/img/social/twitter.png could save 969B (52% reduction).
Losslessly compressing http://www.kenyabuzz.com/…der-Board---Email-Signature--Neutral.jpg could save 920B (2% reduction).
Losslessly compressing http://www.kenyabuzz.com/static/kb/img/social/youtube.png could save 757B (31% reduction).

无损压缩http://www.kenyabuzz.com/media/uploads/clients/kenya_buzz_2.jpg http://www.kenyabuzz.com/media/uploads/clients/kenya_buzz_2.jpg可以节省 594.3KiB(减少 92%)。

首先,日志中的信息不是很准确。

仅当原始图像未压缩且颜色数量非​​常少(理想情况下少于 256 种)时,才可能实现 92% 无损缩减。

无损压缩涉及减少图像的“位深度”,即如果颜色少于 256 种,则将 24 位图像转换为 8 位,这意味着每个像素节省 16 位。但对于您链接的图像来说这似乎不可能,因为它们有超过 256 种颜色。

其次,可以使用有损压缩格式“不失品质”– 差异是如此微妙,人眼甚至无法注意到。

Read 这个答案 https://stackoverflow.com/a/419602/1925257 and 这个答案 https://stackoverflow.com/a/7752936/1925257了解更多信息。真的,请阅读它们,两者都是与此问题相关的出色答案。


因此,我通过以下链接从您正在优化的网站下载了图像:http://www.kenyabuzz.com/media/uploads/clients/kenya_buzz_2.jpg http://www.kenyabuzz.com/media/uploads/clients/kenya_buzz_2.jpg

我打开 Python 控制台并写下了以下内容:

>>> from PIL import Image

>>> # Open the image
>>> im = Image.open("kenya_buzz_2.jpg")
>>> # Now save it
>>> im.save("kenya_buzz_compressed.jpg", format="JPEG", quality=70)

这在我的磁盘上创建了一个新映像。下面是两张图片。

原文 (655.3kB)


压缩(22.4kB ~96% 减少@质量=70)


你可以玩一下quality选项。比如,价值80将为您提供质量更好的图像,但尺寸稍大。


在 Django 中压缩图像

由于这是一个非常受欢迎的问题,我决定添加示例代码来在 Django 中压缩图像。

此代码适用于 Django >= 1.7。

from io import BytesIO
from PIL import Image
from django.core.files import File


def compress(image):
    im = Image.open(image)
    # create a BytesIO object
    im_io = BytesIO() 
    # save image to BytesIO object
    im.save(im_io, 'JPEG', quality=70) 
    # create a django-friendly Files object
    new_image = File(im_io, name=image.name)
    return new_image

这就是你如何使用上面的compress在你的 Django 模型(或任何地方)中运行:

# models.py

class MyModel(...):
    image = models.ImageField(...)

    def save(self, *args, **kwargs):
        # call the compress function
        new_image = compress(self.image)
        # set self.image to new_image
        self.image = new_image
        # save
        super().save(*args, **kwargs)

基本上就是这样。这是相当基本的代码。您可以通过仅在图像更改时而不是每次保存模型时压缩图像来改进代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在django上无损压缩图像 的相关文章

随机推荐

  • 存储过程中的分组和循环

    我需要对 MTH1 MTH2 等列进行求和 但对于我传递的参数 它将为同一帐户代码生成六行信息 这是正确的 它应该产生什么我的问题是如何只返回其中一个数据 但是到目前为止 这就是我的存储过程中六行的总和 ALTER PROCEDURE db
  • 使用 php 发送 Windows Phone 7 的推送通知

    我是一名网络开发人员 PHP 我想使用 PHP 搜索 Windows Phone 7 的推送通知 但结果始终是 NET 请有人可以帮助我 UPDATE 如何同时发送多台设备 因为延迟时间在1秒左右 所以如果我有1000个设备要推送 我可能需
  • Angular ng-repeat 导致闪烁

    我正在使用以下代码显示缩略图列表 div class channel img class channel img div 在控制器中 我有一个 ajax 请求 它可以获取新的缩略图 因此 Angular 会更新图像 但会导致闪烁 有没有办法
  • 如何在 Docpad 中处理路线

    这应该是非常明显的 但我就是无法理解它 如何在 Docpad 中添加额外的路线 我正在寻找相当于express js的Docpad app post function res req next Do stuff 据我所知 我需要为此创建一个
  • dynamodb:如何增加地图中的值

    我正在尝试使用 dynamodb 来维护map名称及其值 eg scores player a 10 我还希望使用增量运算符来执行原子增量 但是 我找不到关于如何使用 更新 dynamodb 地图的文档 这是我到目前为止的Python代码
  • DOMXPath 根据前一个同级值获取同级

    假设我有这个
  • 如何使用 Calc 列规则在 Emacs Org 模式中实现行索引列

    我希望在组织模式表中有一个列是一个简单的单调递增值 即行号 这样当我插入和删除随机行时索引值会自动调整 我怀疑这应该很简单 但看起来我让它变得太困难了 请注意 我是使用 Emacs 和 org 模式构建电子表格的新手 因此 一个简单的电子表
  • d3-sankey 链接在拖动事件时未更新

    问题一 我无法更新拖动事件上的 d3 sankey 链接 我正在尝试复制与此类似的 d3 垂直和水平拖动事件 https bl ocks org d3noob 5028304 https bl ocks org d3noob 5028304
  • 如何使用 angularjs 动态添加行?

    我使用代码通过单击 添加行 来添加行和 2 列 我的需要是 首先在输入字段中填写值 单击 添加项目 按钮后 值必须显示在表结构中 我是初学者 无法使用 for 循环 任何人都可以解决这个问题吗 尝试代码 https jsfiddle net
  • 如何有效地将图像从服务器加载到tableView?

    我有一个表格视图 其中所有单元格都有 UITableViewCellStyleSubtitle 所有细胞的图像均从服务器获取 然而 这些图像并不经常改变 有人可以告诉我如何改善用户体验吗 每次用户向下滚动表格时 就好像它再次上网检查和下载图
  • Windows 上的 DLL Main 与 Windows 上的 DLL Main Linux 上的 __attribute__((constructor)) 入口点

    考虑代码 EXE int main printf Executable Main loading library n ifdef HAVE WINDOWS HMODULE lib LoadLibraryA testdll dll elif
  • 以科学计数法的格式显示数组

    我想以科学计数法显示我的结果 例如 1 2e3 我的数据是数组格式 有没有类似的函数tolist 可以将数组转换为浮点数 以便我可以使用 E 来格式化输出 这是我的代码 import numpy as np a np zeros shape
  • 如何将wiremock POST 请求与一些可选的JSON 参数和任何值相匹配?

    我需要使用wiremock 来测试发送数据的POST 请求 如下所示 name known fixed value dateOfBirth 5123456789000 email known fixed value currentDate
  • 如何在RESTEasy客户端框架中设置HTTP标头?

    RESTEasy 一个 JAX RS 实现 有一个很好的客户端框架 http docs jboss org resteasy docs 2 0 0 GA userguide html RESTEasy Client Framework ht
  • 单击按钮文本并释放按钮时按钮元素不会触发单击事件(但仍在按钮内部)?

    在 WebKit 浏览器上 我在 Mac 上的 Chrome 和 Safari 上进行了测试 按钮元素的行为很奇怪 温在这把小提琴中http jsfiddle net 5ReUn 3 http jsfiddle net 5ReUn 3 您执
  • Mysql 选择记录的倒数对,不重复

    我有一个包含两列的表 人物ID person id 第一个字段 id 正在与谁合作 我需要选择所有合作对 这很容易 但问题出在哪里 表有如下数据 987 102 103 104 104 103 21 102 根据这些数据 我应该有 3 个合
  • Facebook Opengraph og 的动态图像:图像元标记

    我正在尝试在 Facebook 上分享我网站上的图片 图像可以是动态的 但其他元将保持不变 有没有办法可以在 OG IMAGE 标签中拥有动态数据 或者我必须使用 FB Post API 的其他选项 是和不是 Facebook 会抓取您的网
  • 使用 ViewModel 屏蔽可为 null 的域属性

    我正在使用 Entity Framework 4 0 并使用 POCO 对象 当我从数据库填充 POCO 对象时 我将属性值转换为我自己的域对象 我们可以将其称为我的模型 当然 我的模型的字段是否可为空取决于它在数据库中映射到的值是否来自
  • 不允许 CREATE 操作

    我正在尝试利用CloudKit在我的 iOS 应用程序中 但是当我尝试为User记录类型 记录类型名为Users 我收到此错误
  • 在django上无损压缩图像

    我正在做优化 Google 建议对图像进行无损压缩 正在寻找一种在 Django 中实现这一点的方法 这是他们指定的图像 我认为为了有效地完成它 需要在系统范围内实现 可能使用中间件类 想知道以前是否有人这样做过 这是谷歌页面速度分析的链接