¿Cómo creo un archivo BMP con Python puro?

Necesito crear un archivo BMP en blanco y negro con Python puro.

Leí un artículo en wikipedia, formato de archivo BMP , pero no soy bueno en la progtwigción de bajo nivel y quiero llenar este vacío en mi conocimiento.

Entonces, la pregunta es, ¿cómo creo un archivo BMP en blanco y negro con una matriz de píxeles? Necesito hacer esto con Python puro, sin usar ningún módulo como PIL. Es solo para mi educación.

construct es una biblioteca de Python puro para analizar y crear estructuras binarias, protocolos y formatos de archivos. Tiene formato BMP compatible con el uso inmediato.

Este podría ser un mejor enfoque que hacerlo a mano con struct . Además, tendrás la oportunidad de aprender una biblioteca realmente útil (que sin duda es una construct )

Esta es una respuesta completa para mapas de bits monocromos.

 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(" 

Por ejemplo:

 FF XXXXXXXX 81 X......X A5 XX.XX 81 X......X A5 XX.XX BD X.XXXX.X 81 X......X FF XXXXXXXX 

Entonces, codificando esto como una serie de filas:

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

Procesarlo con:

 bmp(smile, 8) 

Tenga en cuenta que es responsabilidad del progtwigdor asegurarse de que el número requerido de bytes esté presente en cada fila provista.

El color negro se especifica en \ xff \ xff \ xff y el color blanco se especifica en el siguiente \ x00 \ x00 \ x00, si desea cambiarlos.

Debe usar el módulo de struct de Python para crear los encabezados binarios que necesitará el archivo BMP. Mantenga los datos de la imagen en un objeto bytearray ; bytearray es un tipo de datos Python nativo poco conocido que puede comportarse como cadenas C: tiene bytes mutables que aceptan números sin signo de 0 a 255 en cada posición, aún se pueden imprimir y usar como una cadena (como argumento a file.write, por ejemplo).

Aquí hay un pequeño progtwig que utiliza struct y otras herramientas para crear una imagen y escribirla como un archivo TGA, en Python puro, tal como lo desea hacer: http://www.python.org.br/wiki/ImagemTGA ( no utiliza bytearrays, sino un módulo de matriz de Python (lo que también es interesante)

Hay una implementación de bitmap de 24 bits en Python 3:

 from struct import pack class Bitmap(): def __init__(s, width, height): s._bfType = 19778 # Bitmap signature s._bfReserved1 = 0 s._bfReserved2 = 0 s._bcPlanes = 1 s._bcSize = 12 s._bcBitCount = 24 s._bfOffBits = 26 s._bcWidth = width s._bcHeight = height s._bfSize = 26+s._bcWidth*3*s._bcHeight s.clear() def clear(s): s._graphics = [(0,0,0)]*s._bcWidth*s._bcHeight def setPixel(s, x, y, color): if isinstance(color, tuple): if x<0 or y<0 or x>s._bcWidth-1 or y>s._bcHeight-1: raise ValueError('Coords out of range') if len(color) != 3: raise ValueError('Color must be a tuple of 3 elems') s._graphics[y*s._bcWidth+x] = (color[2], color[1], color[0]) else: raise ValueError('Color must be a tuple of 3 elems') def write(s, file): with open(file, 'wb') as f: f.write(pack('