Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/07/2011, 14:50
KatonSP
 
Fecha de Ingreso: abril-2009
Mensajes: 63
Antigüedad: 15 años, 8 meses
Puntos: 0
Mostrar imagen bmp con C

Buenas, estoy haciendo una aplicación que lee una imagen bmp, la guarda en un txt en binario y luego la vuelvo a leer para mostrarla utilizando la libreria xlib pero estoy teniendo un problemilla para sacar la imagen, a ver si me podeis hechar un cable.

Este es el código que estoy utilizando.

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. FILE *fimg,*ftext;
  10.  
  11. void nombre_archivo(char texto[]);
  12. void leer_imagen();
  13. void abrir_imagen();
  14.  
  15. char nombre[20]="imagen.txt";
  16. char ruta[100]="/home/albert/Downloads/imagen.bmp";
  17.  
  18. typedef struct bmpFileHeader
  19. {
  20.   uint32_t magic;       /* 2 bytes de identificación */
  21.   uint32_t size;        /* Tamaño del archivo */
  22.   uint16_t resv1;       /* Reservado */
  23.   uint16_t resv2;       /* Reservado */
  24.   uint32_t offset;      /* Offset hasta hasta los datos de imagen */
  25. } bmpFileHeader;
  26.  
  27. typedef struct bmpInfoHeader
  28. {
  29.   uint32_t headersize;      /* Tamaño de la cabecera */
  30.   uint32_t width;           /* Ancho */
  31.   uint32_t height;          /* Alto */
  32.   uint16_t planes;          /* Planos de color (Siempre 1) */
  33.   uint16_t bpp;             /* bits por pixel */
  34.   uint32_t compress;        /* compresión */
  35.   uint32_t imgsize;         /* tamaño de los datos de imagen */
  36.   uint32_t bpmx;            /* Resolución X en bits por metro */
  37.   uint32_t bpmy;            /* Resolución Y en bits por metro */
  38.   uint32_t colors;          /* colors used en la paleta */
  39.   uint32_t imxtcolors;      /* Colores importantes. 0 si son todos */
  40. } bmpInfoHeader;
  41.  
  42. typedef struct {
  43.  
  44.     unsigned char r,g,b,junk;
  45.  
  46. } COLOURINDEX;
  47.  
  48. int main(){
  49.  
  50.     //nombre_archivo(ruta);
  51.     printf("%s\n",nombre);
  52.  
  53.     leer_imagen();
  54.     abrir_imagen();
  55.  
  56.     return 0;
  57. }
  58.  
  59. void leer_imagen(){
  60.  
  61.     bmpInfoHeader bInfoHeader;
  62.     bmpFileHeader header;
  63.  
  64.     fimg=fopen (ruta, "rb");
  65.     if (!fimg){
  66.         printf("no hay imagen");      /* Si no podemos leer, no hay imagen*/
  67.     }
  68.  
  69.     /* Leemos la cabecera de fichero completa */
  70.     fread(&header, sizeof(bmpFileHeader)-2, 1, fimg);
  71.     fread(&bInfoHeader, sizeof(bmpInfoHeader), 1, fimg);
  72.  
  73.     ftext=fopen(nombre,"wb");
  74.  
  75.     fwrite(&header,sizeof(bmpFileHeader)-2,1,ftext);
  76.     fwrite(&bInfoHeader,sizeof(bmpInfoHeader),1,ftext);
  77.  
  78.     fclose(fimg);
  79.     fclose(ftext);
  80.  
  81. }
  82.  
  83. void abrir_imagen(){
  84.  
  85.     ftext=fopen (nombre, "rb");
  86.  
  87.     bmpInfoHeader bInfoHeader;
  88.     bmpFileHeader header;
  89.  
  90.     fread(&header, sizeof(bmpFileHeader)-2, 1, ftext);
  91.     fread(&bInfoHeader, sizeof(bmpInfoHeader)-1, 1, ftext);
  92.  
  93.     int gotindex=1;
  94.     unsigned char junk,r,g,b;
  95.  
  96.     COLOURINDEX colourindex[256];
  97.  
  98.     int screen;
  99.     Display *display;
  100.     display = XOpenDisplay(NULL);
  101.     Window xwindow;
  102.  
  103.     screen = DefaultScreen(display);
  104.     xwindow = RootWindow(display,screen);
  105.  
  106.     int i,j;
  107.     long rgb;
  108.  
  109.     GC gr_context1=XCreateGC(display,xwindow,0,0);
  110.  
  111.        for (i=0;i<255;i++) {
  112.           colourindex[i].r = rand() % 256;
  113.           colourindex[i].g = rand() % 256;
  114.           colourindex[i].b = rand() % 256;
  115.           colourindex[i].junk = rand() % 256;
  116.        }
  117.        if (bInfoHeader.colors > 0) {
  118.           for (i=0;i<bInfoHeader.colors;i++) {
  119.              if (fread(&colourindex[i].b,sizeof(unsigned char),1,ftext) != 1) {
  120.                 fprintf(stderr,"Image read failed\n");
  121.                 exit(-1);
  122.              }
  123.              if (fread(&colourindex[i].g,sizeof(unsigned char),1,ftext) != 1) {
  124.                 fprintf(stderr,"Image read failed\n");
  125.                 exit(-1);
  126.              }
  127.              if (fread(&colourindex[i].r,sizeof(unsigned char),1,ftext) != 1) {
  128.                 fprintf(stderr,"Image read failed\n");
  129.                 exit(-1);
  130.              }
  131.              if (fread(&colourindex[i].junk,sizeof(unsigned char),1,ftext) != 1) {
  132.                 fprintf(stderr,"Image read failed\n");
  133.                 exit(-1);
  134.              }
  135.              fprintf(stderr,"%3d\t%3d\t%3d\t%3d\n",i,
  136.                 colourindex[i].r,colourindex[i].g,colourindex[i].b);
  137.           }
  138.           gotindex = 0;
  139.        }
  140.  
  141.     /* Nos desplazamos el valor de offset hasta llegar a la zona de los datos */
  142.     fseek(ftext, header.offset, SEEK_SET);
  143.  
  144.     /* Hay que invertir los indices porque la imagen se muestra al reves*/
  145.     for(j=(bInfoHeader.height) -1;j>=0;j--) {
  146.  
  147.         for(i=0;i<bInfoHeader.width;i++) {
  148.  
  149.             switch(bInfoHeader.bpp) {
  150.  
  151.             case 1:
  152.                 break;
  153.             case 4:
  154.                 break;
  155.             case 8:
  156.                 if(fread(&junk, sizeof(unsigned char), 1, ftext)!=1){
  157.  
  158.                     printf("error 1");
  159.                     exit(-1);
  160.  
  161.                 }
  162.                 if(gotindex){
  163.  
  164.                     putchar(colourindex[junk].r);
  165.                     putchar(colourindex[junk].g);
  166.                     putchar(colourindex[junk].b);
  167.  
  168.                 }
  169.                 else {
  170.  
  171.                     putchar(junk);
  172.  
  173.                 }
  174.  
  175.                 break;
  176.  
  177.             case 24:
  178.  
  179.                 if(fread(&b, sizeof(unsigned char), 1, ftext)!=1){
  180.  
  181.                     printf("error 2");
  182.                     exit(-1);
  183.  
  184.                 }
  185.                 if(fread(&g, sizeof(unsigned char),1, ftext)!=1){
  186.  
  187.                     printf("error 3");
  188.                     exit(-1);
  189.  
  190.                 }
  191.                 if(fread(&r, sizeof(unsigned char),1, ftext)!=1){
  192.  
  193.                     printf("error 4");
  194.                     exit(-1);
  195.  
  196.                 }
  197.                 /*Obtenemos el valor del color a partir del RGB*/
  198.                 rgb=65536 * r + 256 * g + b;
  199.                 /*Marcamos el color obtenido*/
  200.                 XSetForeground(display, gr_context1, rgb);
  201.                 /*Dibujamos el punto correspondiente*/
  202.                 XDrawPoint(display, xwindow, gr_context1, i, j);
  203.                 break;
  204.             }
  205.  
  206.         }//i
  207.         printf("\n");
  208.     }//j
  209.  
  210. }

Un saludo