[C] lettura valori interi da matrice

di il
5 risposte

[C] lettura valori interi da matrice

Ciao a tutti.
è il mio primo post qua dentro e quindi mi presento.
Mi chiamo Andrea, studio alla specialistica di ingegneria biomedica al Politecnico di Milano e sono appassionato di informatica e programmazione.
Sto cercando di portare a termine un progetto molto ambizioso che va avanti ormai da metà novembre. Ho quasi finito ma mi manca solo un ultimo modulo da completare.
Il progetto consiste in un programma scritto in C per l'elaborazione di immagini bomediche: la parte di elaborazioni l'ho scritta testata e debuggata, ed è a prova di bomba.
Ora mi manca solo la parte di caricamento dell'immagine: sono tipo 3 settimane che cerco una soluzione.
Esistono librerie già fatte, tipo magick core, ma non riesco a capire come farle funzionare.
Dato che il mio programma è un prototipo, ho pensato di convertire l'immagine in una matrice e poi in un vettore usando Matlab, esportarlo come file di testo e infine leggere il file di testo... questo file contiene solamente int da 8 bit.
Ora ho un codice che funziona, ma legge u valori sbagliati:

#include<stdlib.h>
#include<stdio.h>


int main() {
    FILE *fd;
    char x;
    int r;
    int res;
    int counter=0;
    /* apre il file in lettura */
    fd=fopen("/Users/andreacondorelli/Desktop/test.txt", "r");
    if( fd==NULL ) {
        perror("Errore in apertura del file");
        exit(1);
    }
    
    
    /* ciclo di lettura */
    while(1) {
        res=fread(&r, sizeof(int), 1, fd);
        if( res!=1 ) 
            break;
        if(r!=0)counter++;
        
        printf("%d ", r);
    }
    printf("\n pixel letti %d",counter);
    
    
    /* chiude il file */
    fclose(fd);
    
    return 0;
    
}
Con questo codice dovrebbe leggermi i vari interi che son stati salvati in un file di test .txt come valori separati da spazi, ma mi da valori "strani". VI copio un pezzettino dei risultati che vedo su console:
154481970 154481970 154154545 154415410 154679345 154350641 154678577 154743857 154351665 154284338 154284338 154284594 154284082 154744625 154417457 154480690 154612018 154415410 154548017 154613553 154155313 154351409 154745137 154482993 154611762 154614065 154416689 154745137 154679089 154548017 154481713 154744881 154677298 154220337 154285873 154286385 154155313 154611762 154546738 154613553 154613297 154416689 154613809 154351921 154220593 154678833 154153777 154416689 154155057 154153521 154679089 154744113 154679089 154285105 154417201 154678833 154154289 154611762 154744881 154153522 154415410 154611762 154743090 154744881 154679601 154153778 154415154 154744881 154744881 154548529 154219825 154285617 154546738
Il primo valore dovrebbe essere 255.
Ho provato a leggerlo come file di char, ma mi legge un numero alla volta e quindi
255 211 diventa 2 5 5 0 2 1 1 0
Ma a me servono gli interi, di numeri decimali me ne faccio poco o nulla.
Avete idee?
Io lavoro sul mac e con Xcode. Magari sbaglio a salvare il file, ma salvandolo come numeri divisi da spazi dovrebbe funzionare senza problemi....

5 Risposte

  • Re: [C] lettura valori interi da matrice

    questo file contiene solamente int da 8 bit
    Sappi che un 'int' occupa 4 bit e non 8.
    comunque il problema è che leggi da file con 'fread' , il quale esegue una lettura 'non formattata' dei dati, quindi legge i singoli byte. con questa istruzione infatti:
    
    res=fread(&r, sizeof(int), 1, fd);
    
    stai leggendo '1' elemento di dimensione 'sizeof(int)' byte, quindi 4 byte. per cui quando esso viene salvato in 'r', esso conterrà tali valori. Però dato che il file di testo contiene caratteri (infatti nel file leggi '255' , carattere '2' seguito da '5' e ancora '5') in 'r' andranno a finire le 'rappresentazioni' dei caratteri. quindi hai due possibilità:
    1) Salvi la matrice iniziale in modo 'binario' ovvero salvi la rappresentazione del numero nel file (in questo caso la rappresentazione di 255 è 0xFFFFFFFF esadecimale), così che quando poi lo vai a leggere la 'fread' ti da i valori sperati.
    2) leggi i dati salvati con 'fscanf()' che legge i valori da file in maniera 'formattata' un esempio:
    
    fscanf(fd,"%d",&r); //legge il giusto valore da fd e lo salva in r
    
    in entrambi i casi dovresti avere il valore corretto in 'r' , prova e fai sapere
  • Re: [C] lettura valori interi da matrice

    Ha funzionato thx mille.
    Ora si propone solo 1 ultimo problema... devo trattare immagini anche da 1 miliardo di pixel, e quelle non riesco a gestirle tramite matlab.
    Con fscanf posso anche "leggere" direttamente una foto se conosco come è composta, giusto?
    Del tipo se so che il file .bmp ha 30 byte di intestazione e poi inizian i pixel, prima leggo le informazioni dell'intestazione e poi mi leggo tutta l'immagine, giusto?
    Come faccio se so che ogni pixel è definito come un numero da n bit(non byte. prima parlavo di 8 bit, non di 8 byte).
  • Re: [C] lettura valori interi da matrice

    Credo che vale la pena leggerti alcune docuimentazioni su 'gdiplus' , potrebbero fare al caso tuo
  • Re: [C] lettura valori interi da matrice

    Ma nn è una cosa per Windows? Io lavoro su mac e con Xcode...
  • Re: [C] lettura valori interi da matrice

    Ho completato 5 mesi di lavoro con una porcata dal punto di vista della programmazione, ma funziona molto bene. Carico l'immagine con matlab e la esporto com fosse un vettore in un file .txt che poi vado a leggere con fscanf. Grazie mille dell'aiuto, siete stati preziosi
Devi accedere o registrarti per scrivere nel forum
5 risposte