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
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...Envoyé par dword2add
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 //.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;
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...
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; }
Jc
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 ; }
mais l'entête SDL.h n'existe pas il me dit "no such or directory"
Normal faut l'installer!Envoyé par Ucom-C++
http://libsdl.org/
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
Partager