Mostrar BPM en la consola Aprende programación con ejercicios C# Sharp

Lección:

Administración de Archivos


Ejercicio:

Mostrar BPM en la consola 44


Objetivo:

El formato Netpbm es una familia de formatos de archivo de imagen diseñados teniendo en cuenta la simplicidad, en lugar de un tamaño pequeño. Pueden representar imágenes en color, en escala de grises o BW utilizando texto sin formato (aunque exista una variante binaria).

Por ejemplo, una imagen en blanco y negro codificada en ASCII se representa utilizando el encabezado "P1".

La siguiente línea (opcional) puede ser un comentario, precedido de #.

La siguiente línea contiene el ancho y el alto de la imagen.

Las líneas restantes contienen los datos: 1 para los puntos negros 0 para los puntos blancos, como en este ejemplo:

P1
# Este es un mapa de bits de ejemplo de la letra "J"
6 10
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
1 0 0 0 1 0
0 1 1 1 0 0
0 0 0 0 0 0
0 0 0 0 0 0

(ese sería el contenido de un archivo llamado "j.pbm").

Cree un programa para decodificar un archivo de imagen como este y mostrarlo en la pantalla, utilizando solo la consola. Recuerda que el comentario es opcional.


Código:

using System;
using System.IO;
class leerPBM
{
    public static void Main(string[] args)
    {
        string fileName;
        string data;
        string line;
        int width;
        int height;

        Console.WriteLine("Enter the file name: ");
        fileName = Console.ReadLine();
        if (!fileName.Contains(".pbm"))
            fileName += ".pbm";

        if (!File.Exists(fileName))
        {
            Console.WriteLine("File not found!");
            return;
        }

        // File reading
        try
        {
            StreamReader myFile = File.OpenText(fileName);

            line = myFile.ReadLine();
            if (line != "P1")
            {
                Console.WriteLine("Does not seem a B&W ASCII PBM");
                return;
            }
            Console.WriteLine("Found B&W ASCII PBM");

            // Width and height
            line = myFile.ReadLine();
            if ((line.Length > 1) && (line[0] == '#'))
            {
                Console.WriteLine("Comment: "
                    + line.Substring(1));
                line = myFile.ReadLine();
            }

            string[] widthheight = line.Split(' ');
            width = Convert.ToInt32(widthheight[0]);
            height = Convert.ToInt32(widthheight[1]);
            Console.WriteLine("width: {0}", width);
            Console.WriteLine("height: {0}", height);


            // Data reading (gathering all the lines in one)
            data = "";
            line = myFile.ReadLine();
            while (line != null)
            {
                data += line;
                line = myFile.ReadLine();
            }
            myFile.Close();
        }
        catch (IOException problem)
        {
            Console.WriteLine("File was not read properly");
            Console.WriteLine("Details: {0}", problem.Message);
            return;
        }

        // Delete spaces, so that ony 0 and 1 remain
        data = data.Replace(" ", "");

        // And traversing the data, displaying them
        int pos = 0;
        foreach (char symbol in data)
        {
            // After the width, we must advance to the next line
            if (pos % width == 0)
                Console.WriteLine();

            if (symbol == '1')
                Console.Write("X");
            else if (symbol == '0')
                Console.Write(".");

            pos++;
        }

        Console.WriteLine();

    }
}