Domanda

Sto cercando di scrivere un file PGM in un programma C, ma una volta scritto, se provo ad aprirlo per visualizzare l'immagine che ho detto al formato del file immagine non può essere determinato.

Tuttavia, se creo un nuovo file in Geany, copia i dati, quindi salvalo come nuovo PGM, funziona.

Qualche idea del perché questo potrebbe essere?

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

Sto convertendo un'immagine a colori in GreyScale.

È stato utile?

Soluzione

Penso che non dovresti usare \r\n come delimitatore di linea, ma solo \n.Inoltre, controllare che nessuna linea abbia più di 70 caratteri di lunghezza.Dal momento che ogni pixel ha bisogno al massimo 4 caratteri (3 Plus Space) Inserire \n dopo ogni 17 pixel. Puoi separare linee reali con commenti (ad esempio:

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

Altri suggerimenti

Guardando il tuo codice, vedo che inserire un new line ogni elementi height.Secondo il formato del file PGM, dopo l'intestazione, segue

    .
  • A Raster di righe di altezza , in ordine dall'alto verso il basso.Ogni riga è composta da valori di larghezza grigio, in ordine da sinistra a destra.

    Ma stai scrivendo una fila di elementi di altezza.Quindi, probabilmente stai accedendo i dati in modo sbagliato.Infatti, prova a eseguire il debug (con una matita) un'immagine di 3 colonne (larghezza) e 4 righe (altezza).

    ha detto che, cambia il tuo loop per scrivere dati in ordine principale:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top