Visor PGM Curso de Programación Visual Basic

Lección:

Administración de Archivos


Ejercicio:

Visor PGM 4


Objetivo:

El formato PGM es una de las versiones de los formatos de imagen NetPBM. En concreto, es la variante capaz de manejar imágenes en tonos de gris.

Su encabezado comienza con una línea que contiene P2 (si los datos de la imagen están en ASCII) o P5 (si está en binario).

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

Una tercera línea contiene el valor de intensidad que corresponde al objetivo (típicamente 255, aunque también podría ser 15 u otro valor).

A partir de ahí comienzan los colores (tonos de gris) de los puntos que componen la imagen. En formato ASCII (P2) son números del 0 al 255 separados por espacios y quizás nuevas líneas. En formato binario (P5), son bytes contiguos, de 0 (negro) a 255 (blanco).

Debe crear un programa capaz de leer un archivo en formato binario PGM (encabezado P5), sin comentarios, con 255 tonos de gris (pero con un ancho y alto que pueden variar). Además, debe representar los colores (tonos de gris) en la consola de la siguiente manera:
• Si la intensidad del gris es superior a 200, dibujará un espacio en blanco.
• Si está entre 150 y 199, sacarás un punto.
• Si está entre 100 y 149, dibujarás un guión (-).
• Si está entre 50 y 99, dibujarás un símbolo "igual" (=).
• Si está entre 0 y 49, dibujarás un signo de libra (#).

El nombre del archivo que se va a analizar debe leerse desde la línea de comandos, no debe ser solicitado por el usuario ni preestablecido.

Nota: los saltos de línea (\ n) están representados por el carácter 10 del código ASCII (0x0A)


Código:

Imports System
Imports System.IO
Public Class readerImagePGM
    Public Shared Sub Main()
        Console.WriteLine("Enter name of file PGM")
        Dim name As String = Console.ReadLine()
        Dim filePGM As FileStream = File.OpenRead(name)
        Dim data As Byte() = New Byte(filePGM.Length - 1) {}
        filePGM.Read(data, 0, filePGM.Length)
        filePGM.Close()
        Dim mesures As String = ""
        Dim i As Integer = 3

        Do
            mesures += Convert.ToChar(data(i))
            i += 1
        Loop While data(i) <> 10

        i += 1
        Dim size As String()
        Dim width, height As Integer
        size = mesures.Split(" "c)
        width = Convert.ToInt32(size(0))
        height = Convert.ToInt32(size(1))
        Dim colorTone As String = ""

        Do
            colorTone += Convert.ToChar(data(i))
            i += 1
        Loop While data(i) <> 10

        i += 1
        Dim amount As Integer = 0

        For j As Integer = i To filePGM.Length - 1

            If data(j) >= 200 Then
                Console.Write(" ")
            ElseIf data(j) >= 150 OrElse data(j) <= 199 Then
                Console.Write(".")
            ElseIf data(j) >= 100 OrElse data(j) <= 149 Then
                Console.Write("-")
            ElseIf data(j) >= 50 OrElse data(j) <= 99 Then
                Console.Write("=")
            ElseIf data(j) >= 0 OrElse data(j) <= 49 Then
                Console.Write("#")
            End If

            amount += 1
            If amount Mod width = 0 Then Console.WriteLine()
        Next
    End Sub
End Class