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 :

traitement d'image BMP en C++


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 14
    Points : 26
    Points
    26
    Par défaut traitement d'image BMP en C++
    je suis un débutant en traitement d'image.

    maintenant j'arrive a afficher les informations de l’entête de l'image mai j'arrive pas a avoir les pixels j'ai essayé moi même d’écrire un le code le voila
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    R_Img getPixelIMG(QString const & IMG_File_Name)
    {
    	FILE* OpenBitMap = fopen(IMG_File_Name.toLocal8Bit() , "r+" ) ;
     
    	BMPHeader headerIMG;
    	R_Img return_IMG;
    	int i = 0;
    	if(OpenBitMap)
    	{
    		fseek(OpenBitMap , 14 , SEEK_SET);
    		fread(&headerIMG , sizeof(BMPHeader) , 1 , OpenBitMap);
    		return_IMG.height = headerIMG.height;
    		return_IMG.width = headerIMG.width;
     
    		fseek(OpenBitMap , 54 , SEEK_SET);
     
    		pixel pel;
    		FILE *matrice;
     
    		matrice = fopen("matrice.txt" , "w");
    		if (matrice)
    		{
    			for(unsigned int y = 0 ; y < return_IMG.height   ; y++)
    			{
    				for(unsigned int x = 0 ; x < return_IMG.width*3 ; x++)
    				{
    					//pel = getc(OpenBitMap);
    					if(!feof(OpenBitMap))
    					{
    						pel = getc(OpenBitMap);
    						printf("%d " , pel);
    						i++;//nombre de pixel
    						return_IMG.image[x][y] = pel;
    						fprintf(matrice , "%d " , return_IMG.image[x][y]);
    					 }
    				}
    				fprintf(matrice , "\n");
    				printf("\n");
    			}
     
    		}else
    			{
    				printf("erreur en ecriture de la matrice!!!!");
    			}
     
    	fclose(matrice);
    	}
    	printf(" \n\n\n%d" , i);
    	fclose(OpenBitMap);
    	return return_IMG;
    }
    j'en ai besoin d'aide pour que je puisse avancer.

    j'utilise C++ et Qt .

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    es-tu obligé de faire tout "à la main"?
    Car sinon, je suis sûr à 99% que Qt propose une fonction (au pire, une combinaison de 2 fonctions) qui fait ça.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par r0d Voir le message
    Bonjour,

    es-tu obligé de faire tout "à la main"?
    Car sinon, je suis sûr à 99% que Qt propose une fonction (au pire, une combinaison de 2 fonctions) qui fait ça.
    Il y a aussi openCV qui est très utilisé dans le traitement d'image (qu'on peut d'ailleurs utiliser avec Qt pour la GUI).

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 14
    Points : 26
    Points
    26
    Par défaut
    non tout ce que je veux moi c'est d'apprendre a travail avec les pixels et les afficher ,parce-que après j'ai un projet sur les images Medicales CT donc je suis obligé de traité le fichier de l'image par mon propre Code .

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    le format BMP est surement le plus simple qu'il soit.
    En lisant une spéc (http://en.wikipedia.org/wiki/BMP_file_format) tu peux aisément parvenir à écrire un reader.
    Les pixels sont contigus RVB, mais il peut être utilisé avec une palette, alors la lecture des pixels est différente. Les images peuvent être en niveaux de gris, 1, 4, 8, 16, 24 bits. Il est même possible d'utiliser la compression RLE.

    Es-tu certain de ta structure de header ? pixel ?
    Des valeurs de tes SEEK_SET ?
    Pourquoi utiliser une valeur fixe de 400 ? Ce qui représente ~130 pixels..

    Bref, ton code est beaucoup trop simpliste, même pour ce format trivial.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 14
    Points : 26
    Points
    26
    Par défaut
    merci Bousk , c'est gentil. mais je suis qu’un débutant


    voila la structure du header :

    entête du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct  
    {
    	file_type signature_image[2];
    	doubleWord file_size;
    	doubleWord reserved;
    	doubleWord bitmapOffset;
    }fileHeader;
    entête du bitmap
    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
     
    typedef struct
    {
    	doubleWord header_size;
    	doubleWord width;
    	doubleWord height;
    	word plans;
    	word bit_par_pixel;
    	doubleWord type_compression;
    	doubleWord size_bitmap;
    	doubleWord horiz_resolution;
    	doubleWord vert_resolution;
    	doubleWord colors_used;
    	doubleWord colors_importants;
    }BMPHeader;
    Word = entier sur 2 octets
    DoubleWord = entier sur 4 octets
    file_type = entier sur 1 octets

    et pour pixel c'est un unsigned char
    pour les valeur de fseek c'est sur les donnees de l'image commence a l'offset 0x0036 = 54 et la taille de l'entête du fichier c'est 14 octets

  7. #7
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Citation Envoyé par HH.HalimK Voir le message
    non tout ce que je veux moi c'est d'apprendre a travail avec les pixels et les afficher
    Si tu souhaites vraiment gérer le format BMP, alors je n'aurai qu'un seul conseil, utilise un éditeur hexadécimal.

    Ouvre le fichier BMP avec l'éditeur hexadécimal et extrait les valeurs à la main.

    Ensuite tu compares ces valeurs par rapport à ton programme (avec le débuggeur). Tu devrais comprendre rapidement ce qui cloche.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] traitement image bmp
    Par ngossi dans le forum Images
    Réponses: 4
    Dernier message: 24/05/2011, 16h41
  2. Traitement d'image BMP
    Par Hitonari dans le forum C++Builder
    Réponses: 13
    Dernier message: 27/05/2008, 23h36
  3. [débutant] Traitement d'image: WMF ou bmp?
    Par Anthony17 dans le forum Delphi
    Réponses: 2
    Dernier message: 05/07/2006, 13h42
  4. Réponses: 5
    Dernier message: 15/01/2005, 18h29
  5. Création image BMP
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 16h04

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