Visor de imágenes PGM - Python Programming Exercise

En este ejercicio, desarrollarás un programa en Python para crear una utilidad que lea y muestre imágenes en formato PGM, que es una versión de los formatos de imagen NetPBM específicamente para imágenes en escala de grises. Este ejercicio es perfecto para practicar el manejo de archivos, la manipulación de bytes y la visualización de datos en Python. Al implementar este programa, obtendrás experiencia práctica en el manejo de operaciones de archivos, manipulación de bytes y visualización de datos en Python. Este ejercicio no solo refuerza tu comprensión del manejo de archivos, sino que también te ayuda a desarrollar prácticas de codificación eficientes para gestionar las interacciones con el usuario. Además, este ejercicio proporciona una excelente oportunidad para explorar la versatilidad de Python en aplicaciones del mundo real. Al trabajar con el manejo de archivos, la manipulación de bytes y la visualización de datos, aprenderás a estructurar tu código de manera eficiente, lo cual es una habilidad crucial en muchos escenarios de programación. Este ejercicio también te anima a pensar críticamente sobre cómo estructurar tu código para la legibilidad y el rendimiento, convirtiéndolo en una valiosa adición a tu portafolio de programación. Ya seas un principiante o un programador experimentado, este ejercicio te ayudará a profundizar tu comprensión de Python y mejorar tus habilidades para resolver problemas.

 Categoría

Administrar archivos

 Ejercicio

Visor De Imágenes PGM

 Objectivo

Desarrolla un programa Python para crear una utilidad que lea y muestre imágenes en formato PGM, que es una versión de los formatos de imagen NetPBM específicamente para imágenes en escala de grises.

El encabezado de un archivo PGM comienza con una línea que contiene P2 (para datos ASCII) o P5 (para datos binarios).

La segunda línea contiene el ancho y la altura, separados por un espacio.

La tercera línea contiene el valor de intensidad máxima, normalmente 255, pero podría ser otro valor como 15.

Después del encabezado, comienzan los datos de la imagen. En formato ASCII (P2), los datos consisten en números del 0 al 255 separados por espacios y posiblemente líneas nuevas. En formato binario (P5), los datos consisten en bytes contiguos que van del 0 (negro) al 255 (blanco).

Debes crear un programa que pueda leer un archivo en formato binario PGM (encabezado P5), sin comentarios, con 255 tonos de gris (pero con ancho y altura variables). Además, el programa debe representar los valores de la escala de grises en la consola de la siguiente manera:

- Si la intensidad es mayor a 200, mostrar un espacio en blanco.

- Si está entre 150 y 199, mostrar un punto.

- Si está entre 100 y 149, mostrar un guión (-).

- Si está entre 50 y 99, mostrar un signo igual (=).

- Si está entre 0 y 49, mostrar un signo almohadilla (#).

El nombre del archivo a analizar debe leerse desde la línea de comandos, no debe solicitarse por el usuario ni preestablecerse.

 Ejemplo de ejercicio de Python

 Copiar código Python
import sys

def read_pgm(filename):
    """
    Reads a PGM (P5) binary file and returns its width, height, max intensity, and pixel data.
    """
    try:
        with open(filename, "rb") as file:
            # Read magic number
            magic_number = file.readline().strip()
            if magic_number != b"P5":
                raise ValueError("File is not in P5 binary PGM format.")

            # Read dimensions (width and height)
            dimensions = file.readline().strip()
            width, height = map(int, dimensions.split())

            # Read maximum intensity value
            max_intensity = int(file.readline().strip())
            if max_intensity != 255:
                raise ValueError("This program only supports max intensity of 255.")

            # Read image data
            pixel_data = file.read()
            if len(pixel_data) != width * height:
                raise ValueError("Mismatch between pixel data and image dimensions.")

            return width, height, pixel_data

    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 display_pgm_image(width, height, pixel_data):
    """
    Displays PGM image pixel data as symbols based on intensity ranges.
    """
    intensity_map = {
        (200, 255): " ",
        (150, 199): ".",
        (100, 149): "-",
        (50, 99): "=",
        (0, 49): "#",
    }

    for y in range(height):
        row = ""
        for x in range(width):
            intensity = pixel_data[y * width + x]
            for range_min, range_max in intensity_map:
                if range_min <= intensity <= range_max:
                    row += intensity_map[(range_min, range_max)]
                    break
        print(row)


if __name__ == "__main__":
    # Ensure the filename is provided as a command-line argument
    if len(sys.argv) != 2:
        print("Usage: python pgm_viewer.py ")
        sys.exit(1)

    # Read the PGM file
    filename = sys.argv[1]
    width, height, pixel_data = read_pgm(filename)

    # Display the image
    display_pgm_image(width, height, pixel_data)

 Output

A binary PGM file with the following header:

P5
6 4
255

And pixel data (as binary values):

200 180 120 80 30 10
250 190 140 90 40 20
220 170 130 70 60 50
210 160 110 100 0 5

Execution:

python pgm_viewer.py example.pgm

Output:

  . - = # #
  . . - = # #
  . . - = = =
  . . - - # #

 Comparte este ejercicio de Python

 Más Ejercicios Programación Python de Administrar archivos

¡Explora nuestro conjunto de ejercicios de programación Python! Estos ejercicios, diseñados específicamente para principiantes, te ayudarán a desarrollar una sólida comprensión de los conceptos básicos de Python. Desde variables y tipos de datos hasta estructuras de control y funciones simples, cada ejercicio está diseñado para desafiarte de manera gradual a medida que adquieres confianza en la codificación en Python.

  •  Visor BMP de consola V2

    En este ejercicio, desarrollarás un programa en Python para crear una utilidad que muestre un archivo BMP de 72x24 en la consola. Este ejercicio es perfecto pa...

  •  Guardar datos en un archivo de texto

    En este ejercicio, desarrollarás un programa en Python para recopilar múltiples oraciones del usuario (continuando hasta que el usuario presione Enter sin escribir na...

  •  Agregar contenido a un archivo de texto

    En este ejercicio, desarrollarás un programa en Python que solicita al usuario que ingrese múltiples oraciones, deteniéndose cuando presionen Enter sin escribir nada....

  •  Mostrar datos de archivo

    En este ejercicio, desarrollarás un programa en Python para leer y mostrar el contenido de un archivo de texto. Este ejercicio es perfecto para practicar el ma...

  •  TextToHTML con integración de archivos

    En este ejercicio, desarrollarás un programa en Python para mejorar la clase TextToHTML añadiendo la capacidad de guardar sus resultados en un archivo de texto. Este ...

  •  Manipulador de registros

    En este ejercicio, desarrollarás un programa en Python con una clase llamada Logger, que incluye un método estático llamado log. Este ejercicio es perfecto par...