2012-01-04 3 views
8

純粋なPythonで白黒のBMPファイルを作成する必要があります。純粋なPythonでBMPファイルを作成するにはどうすればよいですか?

私はウィキペディアの記事BMP file formatを読んでいますが、私は低レベルのプログラミングに苦しんでおり、私の知る限りではこのギャップを埋めたいと思っています。

質問がありますが、ピクセルのマトリックスを持つ白黒のBMPファイルを作成するにはどうすればよいですか?純粋なPythonでこれを行う必要があります.PILのようなモジュールは使用しません。私の教育のためだけです。

+1

['struct'](http://docs.python.org/library/struct.html)モジュールをチェックしてください。 –

+1

また、[this forum thread](http://pseentertainmentcorp.com/smf/index.php?topic=2034.0)にチェックを入れてください。 – Chewie

+0

ありがとう、Chewie、それは私が必要とするものです –

答えて

3

BMPファイルに必要なバイナリヘッダを作成するには、Pythonのstructモジュールを使用する必要があります。画像データ自体をbytearrayオブジェクトに保存する - bytearrayは、C文字列のように動作することができる、あまり知られていないネイティブのPythonデータ型です。各位置で0〜255の符号なしの数値を受け取り、文字列として使用できます(たとえば、file.writeの引数として)。

構造体やその他のツールを使って画像を作成し、それを純粋なPythonでTGAファイルとして書き出す小さなプログラムです。http://www.python.org.br/wiki/ImagemTGA(bytearraysは使用しませんがpython代わりに、アレイモジュール(これも面白いです)

8

constructはバイナリ構造、プロトコルやファイルフォーマットを解析し、構築するための純粋なPythonライブラリである。これは、アウト・オブ・ボックスBMP形式をサポートしています。

このstructで手作りするよりも良いアプローチかもしれません。また、本当に便利なライブラリを学ぶ機会があります(construct cer

7

これはモノクロビットマップの完全な答えです。

例えば
import math, struct 

mult4 = lambda n: int(math.ceil(n/4))*4 
mult8 = lambda n: int(math.ceil(n/8))*8 
lh = lambda n: struct.pack("<h", n) 
li = lambda n: struct.pack("<i", n) 

def bmp(rows, w): 
    h, wB = len(rows), int(mult8(w)/8) 
    s, pad = li(mult4(wB)*h+0x20), [0]*(mult4(wB)-wB) 
    s = li(mult4(w)*h+0x20) 
    return (b"BM" + s + b"\x00\x00\x00\x00\x20\x00\x00\x00\x0C\x00\x00\x00" + 
      lh(w) + lh(h) + b"\x01\x00\x01\x00\xff\xff\xff\x00\x00\x00" + 
      b"".join([bytes(row+pad) for row in reversed(rows)])) 

だから
FF XXXXXXXX 
81 X......X 
A5 X.X..X.X 
81 X......X 
A5 X.X..X.X 
BD X.XXXX.X 
81 X......X 
FF XXXXXXXX 

、一連の行としてこれをコードする:それがあること

bmp(smile, 8) 

smile = [[0xFF], [0x81], [0xA5], [0x81], [0xA5], [0xBD], [0x81], [0xFF]] 

でそれをレンダリングプログラマーは、必要なニュークリアス指定された各行にはmバイトのバイトが存在します。

黒の色は\ xff \ xff \ xffで指定され、白の色は\ x00 \ x00 \ x00で指定されます。変更する必要があります。

関連する問題