Programa en C para escribir una imagen en formato PGM

PGM significa Mapa gris portátil . Guardar una array 2D en C como imágenes en PNG, JPG u otros formatos requeriría mucho esfuerzo para codificar los datos en el formato especificado antes de escribirlos en un archivo.
Sin embargo, el formato Netpbm ofrece una solución simple con fácil portabilidad.

Un formato Netpbm es cualquier formato gráfico utilizado y definido por el proyecto Netpbm. El formato de mapa de píxeles portátil (PPM), el formato de mapa de grises portátil (PGM) y el formato de mapa de bits portátil (PBM) son formatos de archivo de imagen diseñados para intercambiarse fácilmente entre plataformas.

Netpbm es un paquete de código abierto de programas gráficos y una biblioteca de programación. Se usa principalmente en el mundo Unix, donde se puede encontrar incluido en todas las principales distribuciones de sistemas operativos de código abierto, pero también funciona en macOS y otros. También funciona bajo Microsoft Windows.

Cada archivo comienza con un número mágico de dos bytes (en ASCII) que identifica el tipo de archivo que es (PBM, PGM y PPM) y su codificación (ASCII o binario). El número mágico es una P mayúscula seguida de un número de un solo dígito.

Los formatos ASCII permiten la legibilidad humana y una fácil transferencia a otras plataformas; los formatos binarios son más eficientes en tamaño de archivo, pero pueden tener problemas de orden de bytes nativos.

En los formatos binarios, PBM usa 1 bit por píxel, PGM usa 8 bits por píxel y PPM usa 24 bits por píxel: 8 para rojo, 8 para verde, 8 para azul.

Los formatos PGM y PPM (ambas versiones ASCII y binaria) tienen un parámetro adicional para el valor máximo (números de gris entre blanco y negro) después de las dimensiones X e Y y antes de los datos de píxeles reales. El negro es 0 y el valor máximo es blanco. Hay un carácter de nueva línea al final de cada línea.

¿Cómo escribir archivos PGM?
El formato del archivo es el siguiente:
1. Número mágico “ P2
2. Espacios en blanco (espacios en blanco, TAB, CR, LF).
3. Un ancho , formateado como caracteres ASCII en decimal.
4. Espacio en blanco.
5. Una altura , nuevamente en ASCII decimal.
6. Espacio en blanco.
7. El valor máximo de gris, nuevamente en ASCII decimal.
8. Espacio en blanco.
9. valores de gris ancho X alto , cada uno en ASCII decimal, entre 0 y el valor máximo especificado, separados por espacios en blanco, en formato raster, de arriba a abajo.

// C program to read a BMP Image and 
// write the same into a PGM Image file
#include <stdio.h>
  
void main()
{
    int i, j, temp = 0;
    int width = 13, height = 13;
  
    // Suppose the 2D Array to be converted to Image is as given below
    int image[13][13] = {
      { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 },
      { 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31},
      { 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47},
      { 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63},
      { 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79},
      { 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95 },
      { 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111},
      { 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127},
      { 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143},
      { 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159},
      { 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175},
      { 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191},
      { 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207}
    };
  
    FILE* pgmimg;
    pgmimg = fopen("pgmimg.pgm", "wb");
  
    // Writing Magic Number to the File
    fprintf(pgmimg, "P2\n"); 
  
    // Writing Width and Height
    fprintf(pgmimg, "%d %d\n", width, height); 
  
    // Writing the maximum gray value
    fprintf(pgmimg, "255\n"); 
    int count = 0;
    for (i = 0; i < height; i++) {
        for (j = 0; j < width; j++) {
            temp = image[i][j];
  
            // Writing the gray values in the 2D array to the file
            fprintf(pgmimg, "%d ", temp);
        }
        fprintf(pgmimg, "\n");
    }
    fclose(pgmimg);
}
    Pasos para compilar y ejecutar el código en Ubuntu

  1. Primero, guarde el archivo como » write_pgm_img.c «.
  2. Para compilar el archivo C, abra la terminal (Ctrl+Alt+T) e ingrese la siguiente línea de código
    gcc -o write_pgm_img write_pgm_img.c
  3. Para ejecutar el código ingrese
    ./write_pgm_img
  4. La imagen PGM se guardará como pgmimg.pgm .

La imagen se verá así:

Referencia: https://en.wikipedia.org/wiki/Netpbm_format

Publicación traducida automáticamente

Artículo escrito por SiladittyaManna y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *