Objectivo
Desarrolla un programa Python para crear una utilidad que muestre un archivo BMP de 72x24 en la consola. Utiliza la información del encabezado BMP (consulta el ejercicio del 7 de febrero). Presta atención al campo denominado "inicio de los datos de la imagen". Después de esa posición, encontrarás los píxeles de la imagen. Puedes ignorar la información sobre la paleta de colores y dibujar una "X" cuando el color sea 255, y un espacio en blanco si el color es diferente.
Nota: Puedes crear una imagen de prueba con los siguientes pasos en Paint para Windows: abre Paint, crea una nueva imagen, cambia sus propiedades en el menú Archivo para que sea una imagen en color, ancho 72, alto 24, y guárdala como "mapa de bits de 256 colores (BMP)".
Ejemplo Ejercicio Python
Mostrar Código Python
import sys
def read_bmp_header(filename):
"""
Reads the BMP header and validates that it is a 72x24 BMP file.
Returns the start of image data and the dimensions.
"""
try:
with open(filename, "rb") as file:
signature = file.read(2)
if signature != b'BM':
raise ValueError("The file is not a valid BMP file.")
file.seek(18)
width = int.from_bytes(file.read(4), byteorder='little')
height = int.from_bytes(file.read(4), byteorder='little')
if width != 72 or height != 24:
raise ValueError("This program only supports BMP files with dimensions 72x24.")
file.seek(10)
start_of_data = int.from_bytes(file.read(4), byteorder='little')
return start_of_data, width, height
except FileNotFoundError:
print(f"Error: File '{filename}' not found.")
sys.exit(1)
except Exception as e:
print(f"Error: {str(e)}")
sys.exit(1)
def read_bmp_data(filename, start_of_data, width, height):
"""
Reads the image data from the BMP file starting at the specified position.
Returns the pixel data as a 2D list.
"""
try:
with open(filename, "rb") as file:
file.seek(start_of_data)
pixels = []
row_size = (width + 3) // 4 * 4
for _ in range(height):
row = list(file.read(row_size))[:width]
pixels.append(row)
return pixels[::-1]
except Exception as e:
print(f"Error while reading image data: {str(e)}")
sys.exit(1)
def display_bmp_image(pixels):
"""
Displays the BMP image on the console using 'X' for 255 and ' ' for other values.
"""
for row in pixels:
line = ''.join('X' if pixel == 255 else ' ' for pixel in row)
print(line)
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python bmp_viewer.py ")
sys.exit(1)
filename = sys.argv[1]
start_of_data, width, height = read_bmp_header(filename)
pixels = read_bmp_data(filename, start_of_data, width, height)
display_bmp_image(pixels)
Output
Execution:
python bmp_viewer.py example.bmp
Output:
X X X X X X
X X X X X X
X X X X X X
X X X X X X
...
Código de Ejemplo copiado
Comparte este ejercicios Python