2012-01-04 109 views
8

我需要用純Python創建一個黑白BMP文件。如何用純Python創建BMP文件?

我看了一篇關於維基百科的文章,BMP file format,但是我不擅長低級編程,想填補我的知識空缺。

所以問題是,如何創建具有像素矩陣的黑白BMP文件?我需要用純Python來做到這一點,而不是使用像PIL這樣的模塊。這只是爲了我的教育。

+1

查看['struct'](http://docs.python.org/library/struct.html)模塊。 – 2012-01-04 15:38:51

+1

另外,請查看[本論壇主題](http://pseentertainmentcorp.com/smf/index.php?topic=2034.0)。 – Chewie 2012-01-04 15:48:35

+0

謝謝,Chewie,這正是我需要的 – 2012-01-04 16:02:41

回答

3

您必須使用Python的struct模塊創建BMP文件需要的二進制標頭。保持圖像數據本身在一個bytearray對象 - bytearray是一個鮮爲人知的本機python數據類型,可以像C字符串一樣行爲:具有可變字節,它接受每個位置0-255的無符號數字,仍然可以打印並用作字符串(例如,作爲file.write的參數)。

這是一個小程序,它使用結構和其他工具來創建一個圖像,並將其作爲TGA文件寫入純Python中,就像您想要的那樣: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]] 

與渲染它程序員的責任是確保所需的nu所提供的每一行中都有大量字節。

在\ xff \ xff \ xff中指定黑色,並在下面的\ x00 \ x00 \ x00中指定白色,如果您想要更改它們。