xDroid's Blog

不务正业系列 0

因为写博客的时候有时会上传图片,但是不压缩图片的话打开就会巨慢,所以还要手动压缩一下图片。一开始在windows下用的是riot,具体压缩效果不是特别清楚总之变小了就对了。在ubuntu下一直是用gimp的batch工具箱,但是用起来还是很蛋疼,每次都要输入很多重复的参数,点来点去……特别是在那次制作开机动画的时候愤怒值到了极点(因为它不支持递归操作……)

不过其实需求并没有这么复杂,只要生成宽度为400的缩略图,然后文件名加后缀“_thumb”就行了。我想这也不算什么很难的事情么,就动手google一下脚本怎么写……嗯,然后一个下午就没了。

这一类Script-Fu的脚本保存在~/.gimp-*/scripts下面,我按照谷娘告诉我的结果自己改了一个用用:

(define (last l)
  (car (reverse l))
)
(define (drop-extension filename)
  (unbreakupstr (reverse (cdr (reverse (strbreakup filename ".")))) ".")
)
(define (get-extension filename)
  (last (strbreakup filename "."))
)
(define (batch-resize-rename pattern width quality)
  (let* ((filelist (cadr (file-glob pattern 1)))) ;Get all file names
    (while (not (null? filelist))
      (let*
	(
	  (filename (car filelist))
          (image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
          (drawable (car (gimp-image-get-active-layer image)))
          (image_width (car (gimp-image-width image)))
          (image_height (car (gimp-image-height image)))
	  (height (/ (* image_height width) image_width)) ;keep image ratio
	)
	(gimp-image-scale-full image width height INTERPOLATION-CUBIC)
        (let ((nfilename
	    (string-append (drop-extension filename) "_thumb." (get-extension filename) ) ;add postfix
	    ))
          (if (string=? "jpg" (get-extension filename)) ;if jpg use special save tool to compress image
	    (file-jpeg-save RUN-NONINTERACTIVE
			  image
			  drawable
			  nfilename
			  nfilename
			  quality
			  0
			  1
			  1
			  "Auto generated by gimp batch scripts."
			  0
			  1
			  0
			  0
	    )
	    (gimp-file-save RUN-NONINTERACTIVE image drawable nfilename nfilename)
	  )
	)
        (gimp-image-delete image)
      )
      (set! filelist (cdr filelist))
    )
  )
)

一下子把博文弄长了不少……

这些代码也不是一下子写出来的……不过有注释的话可能看起来会舒服一点。什么?你说看不懂?这么多括号是怎么回事?恭喜入坑Lisp的方言。

调用方法是这样的:

filename=...
width=...
quality=...
gimp -i -b '(batch-resize-rename "'"$filename\" $width $quality"')' -b '(gimp-quit 0)'

或者你也可以把这三个变量填进去……

后来想了一下,这样调用还是太麻烦了,要敲命令行功夫并没有省到哪里去,所以打算用nautilus内置的脚本功能再简化一点操作。大概原理是这样的,在nautilus中右键一个/多个文件,会有“Scripts”菜单,会显示放置于~/.local/share/nautilus/scripts的脚本;脚本被调用时,之前被选中的文件的完整路径会用$@发送给脚本,于是就可以处理啦。

所以我就抄了一下MD5检验的脚本,写出个这么个东西来(当然还绕了不少弯路):

#!/bin/bash

width=400
quality=0.5
GLOB="{\"`echo "$@" | sed 's/ /","/g'`\"}"

gimp -i -b '(batch-resize-rename "'"$GLOB\" $width $quality"')' -b '(gimp-quit 0)' | zenity --progress --title="Processing images..."

谁知gimp工具集里头file-glob死脑筋,不认{str1,str2}这种通配符……我也是醉了……

于是我把脚本改成了这样(微笑):

#!/bin/bash

width=400
quality=0.5

GLOB="*"

gimp -i -b '(batch-resize-rename "'"$GLOB\" $width $quality"')' -b '(gimp-quit 0)' \
 | zenity --progress --title="Processing images..." --auto-close --pulsate

只能用的时候小心一点啦\()/


话说zenity看起来还是蛮好用的:

![](/images/2016-09-gizmo-0/Screenshot from 2016-09-05 16-53-14.jpg)