在易缩略图中使用jpegoptim和PIL

时间:2012-03-19 22:46:02

标签: python django png jpeg gif

我想通过easy-thumbnailPIL处理jpegoptim生成的所有JPEG缩略图。

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

例如:

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

有人能指出我的Python示例或集成jpegoptim的库吗?

3 个答案:

答案 0 :(得分:6)

您可以使用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支持和更好的文件类型识别。

答案 1 :(得分:2)

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

它使用:

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

答案 2 :(得分:0)

我怀疑是否有任何与jpegoptim绑定的python。我能想到的选择是: