26

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

这是他们指定的图像,我认为要有效地完成它需要在系统范围内实现,可能使用中间件类想知道是否有人以前做过。这是页面速度的谷歌分析链接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).
4

3 回答 3

56

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

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

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

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

其次,您可以“不损失质量”地使用有损压缩格式——差异是如此微妙,人眼甚至都不会注意到。

阅读此答案此答案以获取更多信息。真的,请阅读它们,两者都是与此问题相关的出色答案。


所以,我从您正在从这个链接优化的网站下载了一张图片: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)

使用 Python 压缩图像


您可以使用该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)

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

于 2015-11-29T22:40:14.707 回答
4

您应该尝试Django Easy Thumbnails 应用程序,它有一些选项可以添加后处理以优化上传的图像:PostProcessor 文档

我在几个项目的生产中使用它。它运作良好,图像尺寸肯定更小,页面加载速度更快

于 2015-10-12T11:41:28.623 回答
2

我没有经验,但是,picopt看起来很全面。它广泛依赖外部工具来执行优化,因此可能难以在受限或托管的服务器环境中进行设置。

除此之外,请尝试使用谷歌搜索“python 图像优化”。还有一些其他链接表明基于 PIL 的解决方案可能是可能的,例如:

  1. 如何使用 PIL 减小图像文件大小
  2. 图像优化(使用 Python 的 Google App Engine)
于 2015-10-12T10:27:59.433 回答