如何在命令行缩小,缩放和减少PNG的颜色? (Linux,Makefile)

时间:2011-08-09 19:02:26

标签: makefile png imagemagick scale gimp

在Makefile中,我喜欢缩小PNG的大小。

我首先尝试使用ImageMagick,但是虽然我可以调整图像大小(降低)并将其颜色减少到32(或深度减少到5位),但实际文件大小在大多数情况下都大于原始文件。

使用GraphicsMagick,结果相似,有时稍好一些,有时甚至更糟。

[gm] convert input.png -trim -resize 600 -depth 5 -quality 100 output.png

使用Gimp,结果总是很完美。在缩小图像并将颜色减少到32之后,生成的图像总是比原始图像小得多。不幸的是,使用Makefile中的Gimp有点困难,我不知道lisp,只有Python。

问题:   - 有没有办法让ImageMagick或GraphicsMagick减少PNG大小?   - 使用Gimp是否有一种简单的方法来执行此转换,最好使用Python?   - 是否有其他免费工具可以帮助完成这项任务?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我回答我自己的问题。在Makefile中,必须创建并使用临时Gimp目录,以便使用版本控制系统中的脚本,而不是任意本地副本。应该批量处理图像文件,因为Gimp在启动时相对较慢。

mkdir -p gimp/plug-ins
cp downsize.py gimp/plug-ins/
GIMP2_DIRECTORY=`pwd`/gimp gimp --no-interface \
    --batch '(python-fu-downsize RUN-NONINTERACTIVE 600 32 "origdir" "copydir")' \
    --batch '(gimp-quit 0)'

脚本downsize.py是一个普通的Gimp Python脚本,主要包含以下内容:

def downsize(img_w, img_d, in_dir, out_dir):
    for fn in glob.glob(os.path.join(in_dir, "*.png")):
        img = pdb.gimp_file_load(fn, '1')
        if img.width > img_w:
            aspect = float(img.width)/float(img.height)
            h = int(float(img_w)/aspect)
            pdb.gimp_image_scale(img, img_w, h) 
            if img.base_type != RGB:
                pdb.gimp_convert_rgb(img)
            if img.base_type != INDEXED:
                pdb.gimp_convert_indexed(img, NO_DITHER, MAKE_PALETTE, img_d, False, True, "")
            new_path = os.path.join(out_dir, os.path.basename(fn))
            pdb.gimp_file_save(img, pdb.gimp_image_active_drawable(img), new_path, fn)

这段代码可能不正确,这只是基本的想法。