在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? - 是否有其他免费工具可以帮助完成这项任务?
答案 0 :(得分:0)
尝试pngcrush:http://pmt.sourceforge.net/pngcrush/
答案 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)
这段代码可能不正确,这只是基本的想法。