[C]Recupero informazioni da immagine .bmp

di il
5 risposte

[C]Recupero informazioni da immagine .bmp

Buonasera. Ragazzi sto sbattendo la testa su questo problema che alla fine sono sicuro si rivelerà essere abbastanza semplice.
Sto tentando di scrivere una funzione che, dopo aver aperto un file .bmp, salva il valore di ogni pixel in un array di dimensione altezza_immagine*larghezza_immagine.
Al 10° byte dall'inizio del file ci dovrebbe essere il valore dell'offset da sommare all'inizio del file stesso per poter iniziare a leggere il valore di ogni pixel. Il problema è che quando tento di leggere il valore del primo pixel(si tratta di una immagine a 8 bit di profondità, quindi 1 byte per ogni pixel) mi viene fuori un valore negativo o comunque non veritiero. C'è qualche conversione che sto dimenticandomi di fare prima o dopo aver letto il valore? Probabilmente sarà un problema di casting...
Ecco la funzione:
void get_pixels(char path[]){
int i, j=0;
int offset;
char depth;
FILE *fp;
char bmp[5];
    
    for(i=strlen(path)-4;i<strlen(path);i++){
        bmp[j]=path[i];
        j++;
    }
    if(strstr(bmp, ".bmp")==NULL){
        printf("\nIndicare un file .bmp come immagine!\n");
        exit(1);
    }
    
    fp = fopen(path, "r");
    
    fseek(fp, 28, SEEK_SET);
    fscanf(fp, "%c", &depth);
    
    if(depth!=8){
        printf("\nSelezionare una immagine a 8 bit!\n");
        exit(2);
    }
    
    fseek(fp, 10, SEEK_SET);
    fread(&offset, sizeof(offset), 1, fp);
    printf("\n%d", offset);
    
    fseek(fp, offset, SEEK_SET);
    fscanf(fp, "%c", &pixels[0]);
    printf("\n%d", pixels[0]);
    
    fclose(fp);
}

5 Risposte

  • Re: [C]Recupero informazioni da immagine .bmp

    Non ho controllato tutto il codice ma vedo che non hai aperto il file in binario. Mi sembra necessario per leggere un bmp ... quindi "rb" e non solo "r" ...
  • Re: [C]Recupero informazioni da immagine .bmp

    Ho aggiornato il codice, ma il problema resta... Il primo pixel viene letto col valore -92, mentre sulla scala di grigi ha il valore 116.
  • Re: [C]Recupero informazioni da immagine .bmp

    Leggi un char e non un byte!
    quindi usa "unsigned char".
    E per i piu smaliziati:
    
    typedef unsigned char BYTE;
    
    esattamente come è dichiarato da casa M.
  • Re: [C]Recupero informazioni da immagine .bmp

    Il suggerimento dell' unsigned char è corretto ma, nel caso specifico ci deve essere un altro problema perché -92 equivale a 164 (hex A4) e non a 116 che dovresti leggere senza problemi.
  • Re: [C]Recupero informazioni da immagine .bmp

    Non utilizzare fscanf(); usa fread() e specificagli dimensione 1.
    Se ancora non funziona: stampa a video le posizioni che leggi con relativi valori, apri il file con un editor binario e verifica se corrispondono (se non corrispondono verifica con l'editor binario dove si trova fisicamente nel file il primo pixel).
Devi accedere o registrarti per scrivere nel forum
5 risposte