Ejercicio
Mostrar BPM en la consola
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 de Ejemplo
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();
}
}