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

Linux Discussion :

XLib et probleme d'affichage d'image en 24 bits


Sujet :

Linux

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut XLib et probleme d'affichage d'image en 24 bits
    bonjour,
    Je rencontre quelques problèmes au niveau de l'affichage d'images avec la XLib. Jusque maintenant, mon programme fonctionnait avec des images 16 bits, et il fonctionnait très bien. A cause d'une limitation du serveur X, je ne peux pas afficher des images 16 bits lorsque le serveur est en mode 24 bits. J'ai donc tenté de modifier mes images en 24 bits, mais j'ai un problème d'affichage que je n'arrive pas à résoudre. L'image apparait brouillée, comme si le mode (16/24/32) n'était pas le bon. J'ai essayé toutes les combinaisons, sans succès.


    Voici le code source que j'ai créé pour tester ca . Je l'ai testé sur mandriva 2006.

    pour le compiler : gcc -Wall -Werror -L/usr/X11R6/lib -lX11 -o test test.c

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    #include <stdio.h>
    #include <stdlib.h>
     
     
     
    int main() {
     
    	Display *	display;
    	Window 		window;
     
     
     
     
    	if (XInitThreads() == 0)    {
    		printf("Error : initializing XInitThreads.\n");
    		return 1;
    	}
     
    	display = XOpenDisplay(NULL);
     
    	if (display == NULL) {
    		printf("Error : Cannot open display.\n");
    	}
     
     
    	window = XCreateSimpleWindow(display,XDefaultRootWindow(display),0,0,800,600,0,0,0);
    	XSelectInput(display,window,ExposureMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask );
    	XMapWindow(display,window);
     
     
    	// charger l'image
     
    	FILE *f;
    	int x=0,y=0;
    	char *buffer=NULL;
     
    	f = fopen("test.raw","rb");
     
    	if (f == NULL) {
    		printf("Error : loading image.\n");
    	}
    	else {
    		fread(&x,4,1,f);
    		fread(&y,4,1,f);
    		buffer = malloc(x*y*3);
    		if (buffer == NULL){
    			printf("Error : malloc\n");
    		}
    		else {
    			fread(buffer,x*y*3,1,f);
    		}
    		fclose(f);
    	}
     
    	XImage *image = NULL;
     
    	if (buffer) {
    		image = XCreateImage(display, DefaultVisual(display,DefaultScreen(display)),24,ZPixmap,0,buffer,x,y,8,0);
    	}
    	int running = 1;
    	while (running) {
    		XEvent event;
    		XNextEvent(display,&event);
     
    		switch (event.type) {
    			case ButtonPress :
    			if (image) {
    				XLockDisplay(display);
    				XPutImage(display,window,DefaultGC(display,DefaultScreen(display)),image,0,0,event.xbutton.x,event.xbutton.y,x,y);
    				XSync(display,0);
    				XUnlockDisplay(display);
    			}
    			break;
    			case KeyPress :
    			running = 0; // quitter
    			break;
    		}
    	}
     
    	if (image) {
    		XDestroyImage(image);
    	}
    	XUnmapWindow(display,window);
    	XDestroyWindow(display,window);
     
    	return 0;	
    }
    A chaque clic de souris, il va afficher l'image test.raw que l'on peut trouver ici : http://xifedi.free.fr/test.raw

    (format de l 'image tres simple : les 4 premiers octets forment la largeur, les 4 suivants la hauteur, et ensuite les valeurs RGB de l'image dans l'ordre RGB).

    Je n'ai pas bien compris à quoi servent les 3 derniers paramètres de la fonction XCreateSimpleWindow, ainsi que les 2 derniers paramètres de la fonction XCreateImage. Peut-être ça vient de là ?

    Ce code fonctionne très bien avec des images 16 bits , et en remplaçant le 24 par 16 dans le 3ème paramètre de XCreateImage. Par contre, il est nécessaire de passer le serveur X en mode 16 bits.

    Merci d'avance pour vos réponses

  2. #2
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut
    Bon en fait ,j'ai trouvé.


    Lorsqu'on travaille en 24 bits, il faut fournir une XImage avec non pas les valeurs RGB 24bits, mais RGBA 32 bits.

    Evidemment, c'est documenté nulle part dans la XLib.

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

Discussions similaires

  1. [Lazarus] Problème d'affichage d'images avec stretch
    Par Bernard B dans le forum Lazarus
    Réponses: 1
    Dernier message: 05/09/2006, 18h21
  2. [GD] probleme d'affichage d'image
    Par Funattitude dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 07/08/2006, 09h05
  3. Probleme d'affichage d'image dans une fenetre
    Par cgregueusse dans le forum MFC
    Réponses: 1
    Dernier message: 03/08/2005, 11h08
  4. [CR.NET] Probleme d'affichage d'image
    Par ahervieux dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 25/06/2005, 14h06
  5. Probleme d'affichage d'image
    Par nenoeil dans le forum ASP
    Réponses: 2
    Dernier message: 03/06/2005, 11h26

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