IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Lecture binaire d'un fichier image


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Par défaut Lecture binaire d'un fichier image
    Bonjour,

    j'ai un fichier image RAW DATA, c'est à dire qu'il ne contient que les infos utiles à l'image (pas au format ou autre).
    Je voudrais donc le libre en binaire, et enregistrer ce que je lis dans un vecteur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    FILE* Fichier_image;
    	Fichier_image = check_filename("image.raw","r");
    	int ni = 0;
    	for (ni = 0; ni< dataH*dataW; ni++) 
    		{
    		fread( &h_Data[ni], sizeof(unsigned char), 1, Fichier_image);
    		}
    	fclose(Fichier_image);
    où check_filename ne fait que vérifier la bonne ouverture du fichier (et demander un autre nom de fichier sinon).
    Bref ça marche, mais je suis pas sur que ça marche bien.

    Ma question est : puis-je enregistrer des unsigned char dans un vecteur de float ?
    Comme les unsigned char sont sur 1 octet et les floats 4, je ne perds pas d'informations non ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Comme les unsigned char sont sur 1 octet et les floats 4, je ne perds pas d'informations non ?
    unsigned char et float n'ont pas la même taille et ne sont pas codés de la même manière. Ca ne marchera pas.

    Dis-nous plutôt quel est le format de ton fichier RAW et ce que tu veux vraiment faire.

    EDIT : Toutefois, si ton fichier est composé d'unsigned char et que tu veux remplir un tableau de float, il faut récupérer chaque octet (via fgetc par exemple), et tu affectes cette valeur au nième élément de ton tableau.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Par défaut
    Oui ils n'ont pas la même taille, mais pourtant j'arrive bel et bien à lire et afficher une image comme ça.

    Concernant le format RAW, je n'en sais pas plus, c'est quelque chose de j'ouvre avec ImageJ, et j'utilise des images en 8 bits (enregistrées en .raw donc). A priori le fichier est bien composé de unsigned char.

    Comment remplirais tu le tableau de float avec les unsigned char (via fgetc) ? Mettre les 3 premiers octets à zéro puis en dernier l'octet du unsigned char ?


    Ps : en fait j'ouvre l'image comme ceci, je la traite (fonction de convolution) puis je la réécris dans un autre fichier, toujours en binaire (et que je peux ouvrir avec imageJ)

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Je ne vois pas de float dans ton code. Montre nous ce que tu veux faire, on pourra te dire si c'est correct.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Par défaut
    Alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    bool test0(void){
        float
            *h_Data,
            *h_Kernel,
    		*h_ResultCPU,
    		*tmp,
            *h_ResultGPU;
     
       //..
            const int   dataH = 512;
            const int   dataW = 512;
     
     //..
     
        printf("...allocating memory\n");
            h_Data      = (float *)malloc(dataH   * dataW * sizeof(float));
            h_Kernel    = (float *)malloc(kernelH * kernelW * sizeof(float));
            tmp = (float *)malloc(fftH    * fftW * sizeof(float));
    		h_ResultCPU = (float *)malloc(dataH   * dataW * sizeof(float));
            h_ResultGPU = (float *)malloc(dataH    * dataW * sizeof(float));
     
     //..
     
     
        printf("... reading input data\n");
     
    	FILE* Fichier_image;
    	Fichier_image = check_filename("bridge_base.raw","r");
    	int ni = 0;
    	for (ni = 0; ni< dataH*dataW; ni++) 
    		{
    		fread( &h_Data[ni], sizeof(unsigned char), 1, Fichier_image);
    		}
    	fclose(Fichier_image);
     //..

    Vraiment, le reste n'a rien à voir, c'est du traitement d'image en CUDA ... et le problème auquel je m'interesse est à l'ouverture du fichier pour lire mes unsigned char en float ... (le traitement d'image en CUDA nécessite l'utilisation de float)

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Ben si chaque octet du fichier correspond à une valeur du tableau, il suffit de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread( &h_Data[ni], sizeof(unsigned char), 1, Fichier_image);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       int c;
       c = fgetc(Fichier_image);
       if (c == EOF)
       {
          printf("Erreur lecture fichier\n");
          break;
       }
       h_Data[ni] = c;
    De même, il faut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	Fichier_image = check_filename("bridge_base.raw","r");
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	Fichier_image = check_filename("bridge_base.raw","rb");

Discussions similaires

  1. lecture binaire d'un fichier avec header incorporé
    Par gmanouvrier dans le forum Débuter
    Réponses: 4
    Dernier message: 15/11/2013, 18h05
  2. lecture binaire d'un fichier
    Par spirzouf dans le forum Débuter
    Réponses: 5
    Dernier message: 03/11/2011, 01h53
  3. Lecture binaire d'un fichier à un offset précis
    Par israel.jeremy dans le forum Général VBA
    Réponses: 17
    Dernier message: 22/08/2011, 17h14
  4. Lecture binaire d'un fichier VB6
    Par toss.net dans le forum C#
    Réponses: 4
    Dernier message: 23/01/2010, 18h50
  5. Lecture Propriétés d'un fichier Image (tif)
    Par wawan3 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 02/06/2008, 17h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo