読者です 読者をやめる 読者になる 読者になる

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
このソースはループ内で不要な計算しまくってますが^^;