Visor PGM Curso de Programación Java

Lección:

Administración de Archivos


Ejercicio:

Visor PGM 5


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:

import java.util.*;
public class Main
{
	public static void main(String[] args)
	{
		// Read name file PGM
		System.out.println("Enter name of file PGM");
		String name = new Scanner(System.in).nextLine();

		// Read all data
		java.io.FileInputStream filePGM = File.OpenRead(name);
		byte[] data = new byte[filePGM.getLength()];
		filePGM.read(data, 0, filePGM.getLength());
		filePGM.close();

		// Read mesures file PGM
		String mesures = "";
		int i = 3;
		do
		{
			mesures += (char)data[i];
			i++;
		} while (data[i] != 10);
		i++;

		String[] size;
		int width, height;

		size = mesures.split("[ ]", -1);
		width = Integer.parseInt(size[0]);
		height = Integer.parseInt(size[1]);

		// Read color tone PGM
		String colorTone = "";
		do
		{
			colorTone += (char)data[i];
			i++;
		} while (data[i] != 10);
		i++;

		// Read pixels of PGM
		int amount = 0;
		for (int j = i; j < filePGM.getLength(); j++)
		{
			if (data[j] >= 200)
			{
				System.out.print(" ");
			}
			else if (data[j] >= 150 || data[j] <= 199)
			{
				System.out.print(".");
			}
			else if (data[j] >= 100 || data[j] <= 149)
			{
				System.out.print("-");
			}
			else if (data[j] >= 50 || data[j] <= 99)
			{
				System.out.print("=");
			}
			else if (data[j] >= 0 || data[j] <= 49)
			{
				System.out.print("#");
			}

			amount++;

			if (amount % width == 0)
			{
				System.out.println();
			}
		}
	}
}