xilebo noone | 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 :
Code :
- #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 |