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 :

importer une image bmp


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Points : 26
    Points
    26
    Par défaut importer une image bmp
    Je souhaite récupérer les couleurs d'une image bmp (8 ou 24 bits) mais je n'ai rien trouvé sur le forum pour linux.
    Quels headers et fonction sont disponible pour faire cette tache ?
    Merci

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par dword2add
    Je souhaite récupérer les couleurs d'une image bmp (8 ou 24 bits) mais je n'ai rien trouvé sur le forum pour linux.
    Quels headers et fonction sont disponible pour faire cette tache ?
    Merci
    Si tu veux le faire toi-même alors il n'en existe pas vraiment, il faudra utiliser une structure écrite à la main...

    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
    //.h code to define the bitmap header/info structures and be able to read bitmaps under linux
    typedef unsigned char BYTE;
    typedef unsigned int DWORD;
    typedef int LONG;
    typedef unsigned int UINT;
    typedef unsigned short WORD;
     
    // MS-Windows bitmaps' definition:
     
    typedef struct tagBITMAPFILEHEADER
    {
     unsigned short bfType;
     unsigned int bfSize;
     unsigned int bfReserved;
     unsigned int bfOffBits;
    } BITMAPFILEHEADER;
     
    typedef struct tagBITMAPINFOHEADER
    {
     DWORD biSize;
     DWORD biWidth;
     DWORD biHeight;
     WORD biPlanes;
     WORD biBitCount;
     DWORD biCompression;
     DWORD biSizeImage;
     DWORD biXPelsPerMeter;
     DWORD biYPelsPerMeter;
     DWORD biClrUsed;
     DWORD biClrImportant;
    } BITMAPINFOHEADER;
     
    typedef struct tagRGBQUAD
    {
     BYTE rgbBlue;
     BYTE rgbGreen;
     BYTE rgbRed;
     BYTE rgbReserved;
    } RGBQUAD;
     
    typedef struct tagBITMAPINFO
    {
     BITMAPINFOHEADER bmiHeader;
     RGBQUAD bmiColors[1];
    } BITMAPINFO;
    Et un code qui ressemblera à ceci (pas testé mais il devrait fonctionner):

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    unsigned char* LoadBitmapFile(char *f, BITMAPINFOHEADER *bih)
    {
    	FILE *filePtr;
    	BITMAPFILEHEADER bitmapFileHeader;
    	unsigned char *bitmapImage;
    	int imageIdx = 0;
    	unsigned char tempRGB;
    	unsigned short tmps;
    	unsigned int tmpi;
     
    	//open filename
    	filePtr = fopen(f,"rb");
    	if(filePtr == NULL)
    		{
    		fprintf(stderr,"Error opening bitmap file\n");
    		return NULL;
    		}
     
     
    	//read header
    	fread(&tmps, sizeof(unsigned short),1,filePtr);
    	bitmapFileHeader.bfType = tmps;
    	fread(&tmpi, sizeof(unsigned int),1,filePtr);
    	bitmapFileHeader.bfSize =tmpi;
    	fread(&tmpi, sizeof(unsigned int),1,filePtr);
    	bitmapFileHeader.bfReserved= tmpi;
    	fread(&tmpi, sizeof(unsigned int),1,filePtr);
    	bitmapFileHeader.bfOffBits = tmpi;
     
    	//check if bitmap
    	if(bitmapFileHeader.bfType != 0X4d42)
    		{
    		fclose(filePtr);
    		fprintf(stderr,"Not a bitmap file\n");
    		return NULL;
    		}
     
    	//read info header
    	fread(bih,sizeof(BITMAPINFOHEADER),1,filePtr);
     
    	//move file pointer to beginning
    	fseek(filePtr,bitmapFileHeader.bfOffBits,SEEK_SET);
     
    	//alocate enough mem
    	bitmapImage = malloc(bih->biSizeImage);
     
    	if(bitmapImage == NULL)
    	{
    		fclose(filePtr);
    		fprintf(stderr,"Not enough mem for bitmap file\n");
    		return NULL;
    	}
     
    	//read bitmap
    	if(fread(bitmapImage,1,bih->biSizeImage,filePtr) != bih->biSizeImage) 
    	{
    		fclose(filePtr);
    		fprintf(stderr,"Error reading file\n");
    		return NULL;
    	}
     
    	//swap R and B values
    	for(imageIdx=0; imageIdx < (int) bih->biSizeImage;imageIdx+=3)
    	{
    		tempRGB = bitmapImage[imageIdx];
    		bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
    		bitmapImage[imageIdx+2] = tempRGB;
    	}
     
    	fclose(filePtr);
    	return bitmapImage;
    }
    Mais je te le déconseille... Il est plus facile de passer par la SDL par exemple pour le faire pour toi... Ce sera portable en plus...

    Jc

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    La seule solution que je conaisse est via la SDL, qui gère les image bmp.
    La SDL est très simple d'utilisation.

    Je te donnes le code si tu décide de l'utilisée.

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include <stdlib.h>
    #include <string.h>
    #include <SDL.h>
     
    int main( int argc , char *args[] )
    {
        int quit = 0 ;
     
        SDL_Rect offset ;
        offset.x = /* position en x */ ;
        offset.y = /* position en y */ ;
     
        /* déclaration évènements */
        SDL_Event event ;
     
        /* déclaration surfaces */
        SDL_Surface *ecran = NULL ;
        SDL_Surface *imagebmp = NULL ;
     
        /* initialisation SDL Vidéo (flag vidéo) */
        if( SDL_Init( SDL_INIT_VIDEO ) == -1 )
        {
            puts( "Initialisation SDL impossible" ) ;
            return EXIT_FAILURE ;
        }
     
        /* paramétrage vidéo */
        ecran = SDL_SetVideoMode( /* largeur */ , /* longueur */ , 32 /* format image en bits */ , SDL_HWSURFACE | SDL_DOUBLEBUF ) ;
     
        if( ecran == NULL )
        {
            puts( "Initialisation vidéo impossible" ) ;
            EXIT_FAILURE ;
        }
     
        /* chargement images */
        imagebmp = SDL_DisplayFormat( SDL_LoadBMP( "image.bmp" ) ) ;
     
        /* ecran blanc */
        SDL_FillRect( ecran , NULL , SDL_MapRGB( ecran->format , 255 , 255 , 255 ) ) ;
     
        /* charge en mémoire les Surfaces */
        SDL_BlitSurface( imagebmp , NULL , ecran , &offset ) ;
     
        /* mise à jour ecran */
        SDL_Flip( ecran ) ;
     
        while( quit == 0 )
        {
            /* attente d'un evenement */
            SDL_WaitEvent( &event ) ;
     
             /* clique sur X de fermeture de la fenetre */
            if( event.type == SDL_QUIT ) quit = 1 ;
         }
     
        /* libération surfaces */
        SDL_FreeSurface( imagebmp ) ;
        SDL_FreeSurface( ecran ) ;
     
        /* quitte SDL */
        SDL_Quit ;
     
        return EXIT_SUCCESS ;
    }

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 32
    Points
    32
    Par défaut
    mais l'entête SDL.h n'existe pas il me dit "no such or directory"

  5. #5
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut
    Citation Envoyé par Ucom-C++
    mais l'entête SDL.h n'existe pas il me dit "no such or directory"
    Normal faut l'installer!
    http://libsdl.org/

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Oui Goundy a raison, il faut installer la bibliothèque.
    Desole j'ai oublié de le preciser.

    PS : pour ceux qui utilise "Code::Blocks", quelques manip sont a effectuer pour utiliser la sdl sans avoir de console en arrière plan et de pause.

    Voila un petit tuto pour installer la SDL et configurer "Code::Blocks" :
    Tuto SDL

Discussions similaires

  1. Réponses: 12
    Dernier message: 22/02/2005, 18h45
  2. Réponses: 2
    Dernier message: 19/11/2004, 09h54
  3. [C#] Comment convertir une image bmp en jpg !!!
    Par vandeyy dans le forum Windows Forms
    Réponses: 5
    Dernier message: 13/07/2004, 21h37
  4. inserer une image BMP dans un fichier rtf
    Par Alice9 dans le forum MFC
    Réponses: 17
    Dernier message: 06/07/2004, 11h31
  5. [BPW] Impression d'une image BMP
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 21/08/2003, 15h34

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