PDA

Visualizza la versione completa : [C]Lettura profondità colore immagine .bmp


web_pirate
26-05-2014, 19:51
Ragazzi, premetto che non sapevo assolutamente dove piazzare questa discussione, perché non tratta pienamente di programmazione ma allo stesso tempo non se ne discosta nemmeno più di tanto, quindi scusatemi in anticipo.
Ecco il mio problema. Ho scritto una funzione che legge il valore dei pixel di una immagine. Per farlo ha bisgono di verificare che l'immagine sottopostagli è in formato .bmp e che la profondità del colore sia a 8 bit. In un comune file .bmp, l'informazione riguardante la profondità del colore si trova al 28° byte del file binario, il problema è che se cerco di leggere tale valore da un file .bmp creato da Photohop ottengo uno '0' al posto di un '8' come valore della profondità, al 28° byte. Qualcuno può aiutarmi a risolvere il mio problema? Suppongo che i file gestiti da Photoshop salvino le informazioni al loro interno in modo differente, ma al riguardo googlando non ho trovato niente che mi sia stato d'aiuto...
In ogni caso, la funzione che uso per leggere i pixel è la seguente:

void get_pixels(char path[]){
FILE *fp;
int i, j=0, dim=0, count=0;
int offset;
unsigned char depth=NULL;
char bmp[5];

fp = fopen(path, "rb");

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

fseek(fp, 28, SEEK_SET);
fread(&depth, sizeof(depth), 1, fp);
printf("\n%d", 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);

dim=(4-(ima_lar % 4))+ima_lar;
j=0;
fseek(fp, offset, SEEK_SET);
for(i=0;i<ima_alt*dim;i++){
if(count!=ima_lar){
fread(&pixels[j], sizeof(char), 1, fp);
printf("\n%d: %d", j+1, pixels[j]);
j++;
count++;
}else{
fseek(fp, 1, SEEK_CUR);
count=0;
}
}
fclose(fp);
}
Vi ringrazio anticipatamente per la collaborazione... :D

oregon
26-05-2014, 21:11
Facci scaricare l'immagine ...

web_pirate
26-05-2014, 23:57
24033

vbextreme
27-05-2014, 09:24
Non si può leggere un'immagine in quel modo!
Devi crearti le apposite strutture e leggere le proprietà,trovi un milione di siti che spiegano molto bene come leggere i file bmp.

oregon
27-05-2014, 11:47
Io, con il tuo codice, leggo 8 come profondità per quell'immagine ...

@vbextreme ... è vero che sarebbe molto meglio usare le apposite strutture ma non è vietato in assoluto fare diversamente ...

web_pirate
27-05-2014, 12:15
Io, con il tuo codice, leggo 8 come profondità per quell'immagine ...
Com'è possibile? E' giorni che provo e mi da sempre lo stesso errore...

oregon
27-05-2014, 13:41
Sei *sicuro* che il file sia regolarmente aperto? Tu non controlli il valore di fp dopo la fopen ... sicuro che non sia NULL?

minomic
27-05-2014, 16:18
Confermo, se ce ne fosse bisogno, quanto detto da oregon: anche io con il codice di OP leggo 8 come profondità.
A questo punto è probabile che il file non sia aperto: controlla il path che passi alla tua funzione.

:ciauz:

web_pirate
28-05-2014, 11:41
Ho corretto il codice e aggiunto un controllo per un eventuale errore nell'apertura del file...e in effetti l'errore c'era, ma vi spiego perché non ci avevo pensato. Praticamente il path da passare alla funzione è una stringa che il programma si procura da se attraverso un'altra funzione che salva in un array di stringhe tutti i nomi dei file contenuti in una directory che gli indico io. Stampando a video questo array di stringhe mi accorgo che contiene tutti i file esattamente come sono nella cartella. Non avevo pensato subito a questo errore perché in effetti 2.bmp è il secondo di 5 file che si trovano nella cartella. Col primo file non ci sono problemi, lo apre e lo legge subito, ma dal secondo al quinto(quelli che ho creato con photoshop), si presenta questo problema.
Ora ho corretto il codice, ma controllando il path passato alla funzione vedo che è esatto, e d'altronde a voi funziona. Quindi non riesco proprio a capire quale sia il problema.

minomic
28-05-2014, 11:44
Quindi il path è giusto?
A questo punto forse conviene se posti tutto il codice... Può essere che ci sia qualche errore nel passaggio dal primo al secondo file, ma senza vedere il codice è difficile da dire.

Loading