python - 如何使用纯 Python 创建 BMP 文件?

标签 python bmp

我需要用纯 Python 创建一个黑白 BMP 文件。

我在维基百科上读了一篇文章,BMP file format , 但我不擅长底层编程,想填补我的知识空白。

所以问题是,如何创建具有像素矩阵的黑白 BMP 文件?我需要使用纯 Python 来执行此操作,而不是使用 PIL 等任何模块。这只是为了我的教育。

最佳答案

这是单色位图的完整答案。

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

因此,将其编码为一系列行:

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

渲染它:

bmp(smile, 8)

请注意,程序员有责任确保提供的每一行中都存在所需的字节数。

黑色在\xff\xff\xff 中指定,白色在后面的\x00\x00\x00 中指定,是否需要更改。

关于python - 如何使用纯 Python 创建 BMP 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8729459/

相关文章:

python - 如何在Python设备中获取event.post(时钟,数据,持续时间)的时钟参数?

python - 为什么不需要一个强大的 IDE 来编写 Python?

python - 按字母顺序排列具有相同数量的元素

c++ - 使用 fread() 读取 BMP 的文件头

c++ - 如何使用 OpenGL 加载 8 位 bmp?

c - 难以写入位图文件

c++ - 使用 ImageMagick 加载 bmp

python - 当网站也发出 HTTP 错误代码时如何访问 xml 响应

python - PyParsing 的嵌套语法行为不符合预期

c++ - 读/写简单 BMP 图像 C++