Ver Mensaje Individual
  #7 (permalink)  
Antiguo 26/07/2011, 10:36
KatonSP
 
Fecha de Ingreso: abril-2009
Mensajes: 63
Antigüedad: 15 años
Puntos: 0
Respuesta: Mostrar imagen bmp con C

Ya he conseguido, gracias por echarme una mano Instru, el problema que tenía era que después de pintar la imagen volvia a pintar toda la pantalla de negro.

Dejo el código que ya funciona.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdint.h>
  4. #include <stdlib.h>
  5. #include <X11/X.h>
  6. #include <X11/Xlib.h>
  7. #include <X11/Xutil.h>
  8.  
  9. void nombre_archivo(char texto[]);
  10. void abrir_imagen();
  11. void mostrar_imagen();
  12.  
  13. Display *display;
  14. Window win1;
  15. XSetWindowAttributes attributes;
  16. XFontStruct *fontinfo;
  17. GC gr_context1;
  18. XArc arcs[10];
  19. Pixmap pixmap;
  20. Visual *visual;
  21. int screen;
  22. int depth;
  23. int i;
  24. unsigned char grey,r,g,b;
  25.  
  26. FILE *fimg,*ftext;
  27.  
  28. char nombre[20]="imagen.txt";
  29. char ruta[100]="/home/albert/Downloads/imagen2.bmp";
  30.  
  31. typedef struct {
  32.  
  33.     unsigned char r,g,b,grey;
  34.  
  35. } COLOURINDEX;
  36.  
  37. typedef struct bmpFileHeader
  38. {
  39.     unsigned short int type;                 /* Magic identifier            */
  40.     unsigned int size;                       /* File size in bytes          */
  41.     unsigned short int reserved1, reserved2;
  42.     unsigned int offset;                     /* Offset to image data, bytes */
  43. } bmpFileHeader;
  44.  
  45. typedef struct bmpInfoHeader
  46. {
  47.     unsigned int size;               /* Header size in bytes      */
  48.     int width,height;                /* Width and height of image */
  49.     unsigned short int planes;       /* Number of colour planes   */
  50.     unsigned short int bpp;         /* Bits per pixel            */
  51.     unsigned int compression;        /* Compression type          */
  52.     unsigned int imagesize;          /* Image size in bytes       */
  53.     int xresolution,yresolution;     /* Pixels per meter          */
  54.     unsigned int colors;           /* Number of colours         */
  55.     unsigned int importantcolours;   /* Important colours         */
  56. } bmpInfoHeader;
  57.  
  58. bmpFileHeader header;
  59. bmpInfoHeader bInfoHeader;
  60.  
  61. int main(){
  62.  
  63.     fimg=fopen (ruta, "rb");
  64.     if (!fimg){
  65.         printf("no hay imagen");      /* Si no podemos leer, no hay imagen*/
  66.     }
  67.  
  68.     /* Leemos la cabecera de fichero completa */
  69.     fread(&header.type, sizeof(header.type), 1, fimg);
  70.     fread(&header.size, sizeof(header.size), 1, fimg);
  71.     fread(&header.reserved1, sizeof(header.reserved1), 1, fimg);
  72.     fread(&header.reserved2, sizeof(header.reserved2), 1, fimg);
  73.     fread(&header.offset, sizeof(header.offset), 1, fimg);
  74.  
  75.     fread(&bInfoHeader,sizeof(bmpFileHeader),1,fimg);
  76.  
  77.     ftext=fopen(nombre,"wb");
  78.  
  79.     fwrite(&header,sizeof(bmpFileHeader)-2,1,ftext);
  80.     fwrite(&bInfoHeader,sizeof(bmpInfoHeader),1,ftext);
  81.  
  82.     mostrar_imagen();
  83.  
  84.     fclose(fimg);
  85.     fclose(ftext);
  86.  
  87.     return 0;
  88. }
  89.  
  90. void mostrar_imagen(){
  91.  
  92.     //XGCValues gr_values;
  93.     XEvent event;
  94.  
  95.     setbuf(stdout, NULL);
  96.     setbuf(stderr, NULL);
  97.     display = XOpenDisplay(NULL);
  98.     screen = DefaultScreen(display);
  99.     visual = DefaultVisual(display,screen);
  100.     depth = DefaultDepth(display,screen);
  101.     //attributes.background_pixel = XWhitePixel(display, screen);
  102.     //attributes.border_pixel = XBlackPixel(display, screen);
  103.     attributes.override_redirect = 0;
  104.  
  105.     win1 = XCreateWindow(display, XRootWindow(display, screen), 200, 200, bInfoHeader.width,
  106.             bInfoHeader.height, 5, depth, InputOutput, visual, CWBackPixel | CWBorderPixel
  107.                     | CWOverrideRedirect, &attributes);
  108.  
  109.     XSelectInput(display, win1, ExposureMask | ButtonPressMask | KeyPressMask);
  110.     pixmap = XCreatePixmap(display, win1, bInfoHeader.width, bInfoHeader.height, depth);
  111.     /*fontinfo = XLoadQueryFont(display, "6x10");
  112.     gr_values.font = fontinfo->fid;
  113.     gr_values.function = GXcopy;
  114.     gr_values.plane_mask = AllPlanes;
  115.     gr_values.foreground = BlackPixel(display,screen);
  116.     gr_values.background = WhitePixel(display,screen);*/
  117.     gr_context1 = XCreateGC(display, win1, 0, 0);
  118.  
  119.     //XDefineCursor(display, win1, XCreateFontCursor(display, XC_heart));
  120.     XMapWindow(display, win1);
  121.  
  122.     /*do {
  123.         XNextEvent(display, &event);
  124.         if (event.type == Expose) {
  125.  
  126.             //XCopyArea(display, win1, pixmap, gr_context1, 50, 25, bInfoHeader.width, bInfoHeader.height, 0,
  127.                     0);
  128.             XSetFunction(display, gr_context1, GXinvert);
  129.             XDrawImageString(display, pixmap, gr_context1, 80, 45, "pixmap", 6);
  130.             XDrawImageString(display, pixmap, gr_context1, 90, 60, "copy", 4);
  131.             XSetFunction(display, gr_context1, GXcopy);
  132.             XSetForeground(display, gr_context1, 505);/
  133.  
  134.         }
  135.     } while (event.type != KeyPress);*/
  136.  
  137.     XCopyArea(display, pixmap, win1, gr_context1, 0, 0, bInfoHeader.width, bInfoHeader.height, 0, 0);
  138.     abrir_imagen();
  139.     //XDrawString(display, win1, gr_context1, 10, 32, "Now press a key to exit",23);
  140.  
  141.     XFlush(display);
  142.  
  143.     do {
  144.         XNextEvent(display, &event);
  145.     } while (event.type != KeyPress);
  146.  
  147.     printf("closing display\n");
  148.     XCloseDisplay(display);
  149.  
  150. }
  151.  
  152. void abrir_imagen(){
  153.  
  154.     int gotindex=1;
  155.  
  156.     unsigned char r,g,b,grey;
  157.  
  158.     int i,j;
  159.     long rgb;
  160.  
  161.     /* Nos desplazamos el valor de offset hasta llegar a la zona de los datos */
  162.     fseek(fimg, header.offset, SEEK_SET);
  163.  
  164.     /* Hay que invertir los indices porque la imagen se muestra al reves*/
  165.     for(j=bInfoHeader.height-1;j>=0;j--) {
  166.  
  167.         for(i=bInfoHeader.width-1;i>=0;i--) {
  168.  
  169.             switch(bInfoHeader.bpp) {
  170.  
  171.             case 1:
  172.                 break;
  173.             case 4:
  174.                 break;
  175.             case 8:
  176.                 if (fread(&grey, sizeof(unsigned char), 1, fimg) != 1) {
  177.                     fprintf(stderr, "Image read failed\n");
  178.                     exit(-1);
  179.                 }
  180.                 if (gotindex) {
  181.                     putchar(r);
  182.                     putchar(g);
  183.                     putchar(b);
  184.                 } else {
  185.                     putchar(grey);
  186.                 }
  187.                 break;
  188.  
  189.             case 24:
  190.                 if (fread(&b, sizeof(unsigned char), 1, fimg) != 1) {
  191.                     fprintf(stderr, "Image read failed 1\n");
  192.  
  193.                     exit(-1);
  194.                 }
  195.                 if (fread(&g, sizeof(unsigned char), 1, fimg) != 1) {
  196.                     fprintf(stderr, "Image read failed 2\n");
  197.                     exit(-1);
  198.                 }
  199.                 if (fread(&r, sizeof(unsigned char), 1, fimg) != 1) {
  200.                     fprintf(stderr, "Image read failed 3\n");
  201.                     exit(-1);
  202.                 }
  203.  
  204.                 /*Obtenemos el valor del color a partir del RGB*/
  205.                 rgb=65536 * r + 256 * g + b;
  206.                 /*Marcamos el color obtenido*/
  207.                 XSetForeground(display, gr_context1, rgb);
  208.                 /*Dibujamos el punto correspondiente*/
  209.                 XDrawPoint(display, win1, gr_context1, i, j);
  210.                 break;
  211.             }
  212.  
  213.         }//i
  214.         printf("\n");
  215.     }//j
  216.  
  217. }