Pregunta

Estoy tratando de escribir un PGM archivo en un programa en C, pero una vez que está escrito, si intento abrirlo para ver la imagen me dice que el formato de archivo de imagen no puede ser determinado.

Sin embargo, si puedo crear un nuevo archivo en geany, copiar los datos y, a continuación, guardar como un nuevo PGM, funciona.

Alguna idea de por qué podría ser esto?

FILE * grey = fopen("greyscale.pgm", "w");

fprintf(grey, "P2 \r\n%d %d \r\n255 \r\n", width, height);

for (i = 0; i < width; i++) {
    for (j = 0; j < height; j++) {
        fprintf(grey, "%d ", ((imageArray[i][j].red + imageArray[i][j].green + imageArray[i][j].blue)/3));
    }
    fprintf(grey, "\r\n");
}

Yo soy de convertir una imagen de color a escala de grises.

¿Fue útil?

Solución

Creo que no debe usar \r\n como delimitador de línea, sino solo \n.Además, compruebe que ninguna línea tiene más de 70 caracteres de longitud.Dado que cada píxel necesita a la mayoría de los 4 caracteres (3 más espacio) inserte \n después de cada 17 píxeles. Puede separar líneas reales con comentarios (por ejemplo:

pixel11 pixel12 pixel13
pixel14 pixel15
# switch to next row
pixel21 pixel22 pixel23
pixel24 pixel25
# etc.

Otros consejos

Mirando el código, veo que usted inserte un new line cada height elementos.De acuerdo con el PGM formato de archivo, después de la cabecera, de la siguiente manera

  • Un trama de la Altura de las filas, en orden de arriba a abajo.Cada línea consta de Ancho de valores de gris, en orden de izquierda a derecha.

Pero tu estás escribiendo una fila de la altura del elemento.Así, su son, probablemente, el acceso a los datos en un camino equivocado.De hecho, intenta depurar (con un lápiz) una imagen de 3 columnas (ancho) y 4 filas (altura).

Dijo que, a cambio de su bucle para escribir datos en el principal de la fila orden:

// write data to file
int row, col;
for (row = 0; row < height; ++row)
{
    for (col = 0; col < width; ++col)
    {
        fprintf(grey, "%d ", (imageArray[row][col].red + imageArray[row][col].green + imageArray[row][col].blue)/3));
    }
    fprintf(grey, "\n\r");
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top