Question

J'essaie d'écrire un fichier PGM dans un programme C, mais une fois qu'il est écrit, si j'essaie de l'ouvrir pour afficher l'image, on me dit que le format de fichier image ne peut pas être déterminé.

Cependant, si je crée un nouveau fichier dans Geany, copiez les données, puis enregistrez-la en tant que nouveau PGM, cela fonctionne.

Une idée pourquoi cela pourrait être?

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");
}

Je convertit une image couleur en niveaux de gris.

Était-ce utile?

La solution

Je pense que tu ne devrais pas utiliser \r\n En tant que délimiteur de ligne, mais seulement \n. Vérifiez également qu'aucune ligne n'a plus de 70 caractères. Puisque chaque pixel a besoin au plus de 4 caractères (3 plus d'espace) \n après tous les 17 pixels. Vous pouvez séparer les vraies lignes avec des commentaires (par exemple:

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

Autres conseils

En regardant votre code, je vois que vous insérez un new line tous height éléments. Selon le format de fichier PGM, après l'en-tête, suit

  • UN raster de rangées de hauteur, dans l'ordre de haut en bas. Chaque ligne se compose de valeurs de gris largeur, dans l'ordre de gauche à droite.

Mais vous écrivez une rangée d'élément de hauteur. Ainsi, vous accédez probablement aux données de manière erronée. En fait, essayez de déboguer (avec un crayon) une image de 3 colonnes (largeur) et 4 lignes (hauteur).

Dit cela, modifiez votre boucle pour écrire des données dans la commande de lignes de ligne:

// 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");
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top