栗子現場直播 千篇一栗
有很多簡單的道理,若不是被遺忘,不是察覺不到,就是知易行難。

2008年10月18日 星期六

Python + Imagemagick

  要在畫面上繪畫鼓譜,我其實只需要這麼簡單的東東。  但結果事情卻變得相當複雜。例如我想改變圓的大小,或者改顏色,結果就要同時改動數張圖。改動的動作多,就會增加犯錯的機會。
  曾經想過為繪圖自動化,自己親手打作繪圖 script 程式,但結果我還是先嘗試用 Imagemagick 一次。

  在官網找 Help 了好久,真的好久,終於才發現網頁左邊的「Usage」才是真的的 Help 。編寫 convert command 看似很嚇人,而事實上又真的頗嚇人。例如要畫一個大 don ,就要這樣做:
convert ^
-size 256x256 xc:#00000000 ^
-fill black -stroke none -draw "circle 128,128 128,16" ^
-fill white -stroke none -draw "circle 128,128 128,24" ^
-fill #CC3333 -stroke none -draw "circle 128,128 128,40" ^
-quality 95 PNG32:don_big.png
  相信對一個普通市民來說,這些碼實在叫人反胃。但對一個寫程式維生的傢伙來說,如果是放在 script 裡,以後要做改動之類的動作,其實是十分方便的。
  然後我再用 Python script 把所有東東自動化。
import os

color_list=[\
{"name":"don", "color":"#CC3333FF"},\
{"name":"kat", "color":"#66CCCCFF"},\
{"name":"null","color":"#CCCC00FF"},\
]
radius_list=[\
{"name":"small","radius":[64,60,51]},\
{"name":"big","radius":[112,104,88]},\
]

for color in color_list:
for radius in radius_list:
cmd=""
cmd+="convert -size 256x256 xc:#00000000"
cmd+=" -fill #000000FF -stroke none -draw \"circle 128,128 128,%(r0)d\""\
%{"r0":128-radius["radius"][0]}
cmd+=" -fill #FFFFFFFF -stroke none -draw \"circle 128,128 128,%(r0)d\""\
%{"r0":128-radius["radius"][1]}
cmd+=" -fill %(color)s -stroke none -draw \"circle 128,128 128,%(r0)d\""\
%{"color":color["color"],"r0":128-radius["radius"][2]}
cmd+=" -quality 95 PNG32:..\\res\\%(color)s_%(radius)s_0.png"\
%{"color":color["name"],"radius":radius["name"]}
os.system(cmd)

for color in color_list:
for radius in radius_list:
cmd=""
cmd+="convert -size 256x256 xc:#00000000"
cmd+=" -fill #000000FF -stroke none -draw \"rectangle 0,%(r0)d 256,%(r1)d\""\
%{"r0":128-radius["radius"][0],"r1":128+radius["radius"][0]}
cmd+=" -fill #FFFFFFFF -stroke none -draw \"rectangle 0,%(r0)d 256,%(r1)d\""\
%{"r0":128-radius["radius"][1],"r1":128+radius["radius"][1]}
cmd+=" -fill %(color)s -stroke none -draw \"rectangle 0,%(r0)d 256,%(r1)d\""\
%{"r0":128-radius["radius"][2],"r1":128+radius["radius"][2],"color":color["color"]}
cmd+=" -quality 95 PNG32:..\\res\\%(color)s_%(radius)s_1.png"\
%{"color":color["name"],"radius":radius["name"]}
os.system(cmd)
  感覺極度良好。以後要改顏色,只要修改 color_list 和 radius_list 就可以了。  另外,也因為底色能設定為 #00000000 的關係,也修正了之前透明的顏色的問題。

  本來, Python 還有一個 addon ,叫 PythonMagick ,能夠直接在 Python 使用 Imagemagick ,不用經過 os.system 使用 convert 。如果這樣做的話,也能避免 OS 相容的問題。但是,因為事情涉及 compile ,感覺太嚇人,所以不做了。

※在 Imagemagick 中, ARGB 的寫法是 #RRGGBBAA 。

沒有留言: