Programming Course in C# ¡Free!

Display PBM on console

 Saturday, April 06, 2013 published by Exercises C#
Proposed exercise



The Netpbm format is a family of image file formats designed with simplicity in mind, rather than small size. They can represent color, grayscale or BW images using plain text (even though a binary variant exists).



For example, a black and white image coded in ASCII is represented using the header "P1".



The following line (optional) might be a comment, preceded with #



The next line contains the width and height of the image.



The remaining line(s) contain the data: 1 for black points 0 for white points, as in this example:




P1

# This is an example bitmap of the letter "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



(that would be the content of a file named "j.pbm").



Create a program to decode an image file like this and display it on screen, using just the console. Remember that the comment is optional.

Output





Solution




using System;
using System.IO;

class ReadPBM
{
public static void Main()
{
Console.WriteLine("Enter the name: " ); 
string name = Console.ReadLine();

if ( ! name.Contains(".pbm"))
name += ".pbm";

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

try      
{
string data = "";

StreamReader file = File.OpenText(name);      
int width, height;

string line = file.ReadLine();
if (line != "P1") 
{
Console.WriteLine("format of image not valid");
return;
}


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

string [] mesures = line.Split(' ');

width = Convert.ToInt32(mesures[0]);
height = Convert.ToInt32(mesures[1]);      

Console.WriteLine("Width: {0} px - Height: {1} px", width, height);      

line = file.ReadLine();
while (line != null)
{
data += line;
line = file.ReadLine();
}

file.Close();
}
catch (xception)
{
Console.WriteLine("Error");
return;
}

data = data.Replace(" ","");

int position = 0;
foreach (char symbol in data)
{
if (position % width == 0)  
Console.WriteLine();

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

position ++;
}
}
}