不务正业系列 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
只能用的时候小心一点啦~\(▽)/~