PILでGBA with Python
PILを使った理想的な抽象化の例。
昔はわざわざ、BMPのstructureを定義したりして読んだりしましたよね。(遠い目)
必要なのはPython、そしてPILのインストール。
あとはfrom PIL import Imageです。
かなーり、適当なリストですが、いかに抽象化が素晴らしいか解るはずです。(こういう抽象化は賛成)
256色のBMPから、
GBAのRAWな16色パレットとキャラクタファイルを生成しています。
がgifでもなんでもいける筈ですよ。
hogeとか書いているところはreplaceして!
かなり決めうちですが、自分で使うには十分。
スプライトアニメーションや、BGのアニメ、パレットアニメなど、
バイナリのデータ構造を考え、オリジナルフォーマットを書くのは面白いので是非。
image = Image.open(file('hoge.bmp')) t = image.copy(); w, h = image.size data = t.getdata() palette = t.getpalette() palette_list = [] for i in range(256): v = i*3 #下位3bitは無視(RGB,5,5,5のフォーマットのため) palette_list.append( (palette[v+0]>>3)<<0|(palette[v+1]>>3)<<5|(palette[v+2]>>3)<<10 ) #16色だけパレットに palette_list = palette_list[0:16] pal_file = open("hoge.pal",'wb') for palette in palette_list: pal_file.write(struct.pack('H',palette)) pal_file.close() block_list = [] for y in xrange(0,h,8): for x in xrange(0,w,8): block = [] for by in range(8): for bx in range(4): #元が256色なので16色以上使っている場合は、きちんとdataを&で制御すること!(これはあくまで適当 #16色なので、byteに2ピクセルのデータが入る block.append( data[(x+y*w)+(bx*2+0+by*w)]|data[(x+y*w)+(bx*2+1+by*w)]<<4 ) block_list.append(block) dat = open('hoge.dat','wb') for block in block_list: for value in block: dat.write(struct.pack('B',value)) dat.close()
強い! 早い! 便利!
それがPython。
このソースはループ内で不要な計算しまくってますが^^;