【问题标题】:Using jpegoptim with PIL in easy-thumbnails在简单的缩略图中使用 jpegoptim 和 PIL
【发布时间】:2012-04-04 11:06:13
【问题描述】:

我想通过PILjpegoptim 处理使用easy-thumbnail 生成的所有JPEG 缩略图。

使用 PIL 的优化:image.save(..,optimize=1,...) 根本没有优化。

例如:

  • 使用 PIL:123KB
  • 使用 PIL + 优化:112KB
  • 使用 PIL + 优化 + jpegoptim:52KB

谁能给我指出集成 jpegoptim 的 Python 示例或库?

【问题讨论】:

  • 您确定 jpegoptim 没有更改 JPEG 质量设置吗?在不丢失一些信息的情况下,应该不可能缩小 2 倍以上的尺寸。
  • 我正在使用 jpegoptim --strip-all。来自文档:“从输出文件中去除所有(评论和 Exif)标记”

标签: python django png jpeg gif


【解决方案1】:

您可以使用thumbnail_created 信号并通过subporecess.Popen 调用外部应用程序。我只是在我的项目中意识到这一点。您甚至可以在使用saved_file 信号上传图片时对其进行优化!

Here is我的代码:

import subprocess
from os.path import splitext

from django.dispatch import receiver
from easy_thumbnails.signals import saved_file, thumbnail_created

@receiver(saved_file)
def optimize_file(sender, fieldfile, **kwargs):
    optimize(fieldfile.path)

@receiver(thumbnail_created)
def optimize_thumbnail(sender, **kwargs):
    optimize(sender.path)

def optimize(path):
    runString = {
        ".jpeg": u"jpegoptim -f --strip-all '%(file)s'",
        ".jpg": u"jpegoptim -f --strip-all '%(file)s'",
        ".png": u"optipng -force -o7 '%(file)s' && advpng -z4 '%(file)s' && pngcrush -rem gAMA -rem alla -rem cHRM -rem iCCP -rem sRGB -rem time '%(file)s' '%(file)s.bak' && mv '%(file)s.bak' '%(file)s'"
    }

    ext = splitext(path)[1].lower()
    if ext in runString:
        subprocess.Popen(runString[ext] % {'file': path}, shell=True)

runString 取自 trimage。在 Debian 上,您需要安装以下软件包:jpegoptim optipng pngcrush advancecomp。或者只是使用其他工具,例如smush.py


我还发现 this project 封装了上面的代码,支持 gif 和更好的文件类型识别。

【讨论】:

    【解决方案2】:

    我发现https://github.com/thebeansgroup/smush.py 是 Python >=2.7 中的无损图像优化器。我选择了https://github.com/beatak/smush.py,这是一个适用于 Python >= 2.5 的分支,因为我们在服务器上使用的是 debian stable。

    它使用:

    希望在文件上多次使用pngnq 不会降低质量,我们计划每周在所有上传的媒体上运行此脚本。

    【讨论】:

      【解决方案3】:

      我怀疑 jpegoptim 是否存在任何 python 绑定。我能想到的选项是:

      【讨论】:

        猜你喜欢
        • 2012-11-18
        • 2011-10-04
        • 2011-05-12
        • 2010-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-04
        相关资源
        最近更新 更多