无损压缩django上的图像

19 python django lossless-compression

我正在进行优化,Google建议对图像进行无损压缩,寻找在Django中实现此功能的方法.

这是他们指定的图像,我认为要有效地完成它需要在系统范围内实施,可能使用中间件类,想知道是否有人之前已经这样做过.以下是来自pagespeed的Google Analytics的链接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).
Run Code Online (Sandbox Code Playgroud)

xyr*_*res 32

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

首先,日志中的信息是相当误导的,因为使用无损格式无法将图像压缩92%(除了某些情况,如单色图像,基本几何形状如正方形等).阅读此答案此答案以获取更多信息.真的,读它们,都是很好的答案.

其次,你可以使用有损压缩格式"不失质量" - 差异是如此微妙,人眼甚至没有注意到.


因此,我从以下链接中优化的网站下载了一张图片: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)
Run Code Online (Sandbox Code Playgroud)

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

原创(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
Run Code Online (Sandbox Code Playgroud)

这就是你可以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)
Run Code Online (Sandbox Code Playgroud)

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

  • 确切地说,我会在上传部分使用它,或者像普通静态图像的trimage. (2认同)

mha*_*wke 2

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

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

  1. 如何使用 PIL 减小图像文件大小
  2. 图像优化(带有 Python 的 Google App Engine)