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#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
FILE *fimg,*ftext;
void nombre_archivo(char texto[]);
void leer_imagen();
void abrir_imagen();
char nombre[20]="imagen.txt";
char ruta[100]="/home/albert/Downloads/imagen.bmp";
typedef struct bmpFileHeader
{
uint32_t magic; /* 2 bytes de identificación */
uint32_t size; /* Tamaño del archivo */
uint16_t resv1; /* Reservado */
uint16_t resv2; /* Reservado */
uint32_t offset; /* Offset hasta hasta los datos de imagen */
} bmpFileHeader;
typedef struct bmpInfoHeader
{
uint32_t headersize; /* Tamaño de la cabecera */
uint32_t width; /* Ancho */
uint32_t height; /* Alto */
uint16_t planes; /* Planos de color (Siempre 1) */
uint16_t bpp; /* bits por pixel */
uint32_t compress; /* compresión */
uint32_t imgsize; /* tamaño de los datos de imagen */
uint32_t bpmx; /* Resolución X en bits por metro */
uint32_t bpmy; /* Resolución Y en bits por metro */
uint32_t colors; /* colors used en la paleta */
uint32_t imxtcolors; /* Colores importantes. 0 si son todos */
} bmpInfoHeader;
typedef struct {
unsigned char r,g,b,junk;
} COLOURINDEX;
int main(){
//nombre_archivo(ruta);
leer_imagen();
abrir_imagen();
return 0;
}
void leer_imagen(){
bmpInfoHeader bInfoHeader;
bmpFileHeader header;
if (!fimg){
printf("no hay imagen"); /* Si no podemos leer, no hay imagen*/ }
/* Leemos la cabecera de fichero completa */
fread(&header
, sizeof(bmpFileHeader
)-2, 1, fimg
); fread(&bInfoHeader
, sizeof(bmpInfoHeader
), 1, fimg
);
ftext
=fopen(nombre
,"wb");
fwrite(&header
,sizeof(bmpFileHeader
)-2,1,ftext
); fwrite(&bInfoHeader
,sizeof(bmpInfoHeader
),1,ftext
);
}
void abrir_imagen(){
ftext
=fopen (nombre
, "rb");
bmpInfoHeader bInfoHeader;
bmpFileHeader header;
fread(&header
, sizeof(bmpFileHeader
)-2, 1, ftext
); fread(&bInfoHeader
, sizeof(bmpInfoHeader
)-1, 1, ftext
);
int gotindex=1;
unsigned char junk,r,g,b;
COLOURINDEX colourindex[256];
int screen;
Display *display;
display = XOpenDisplay(NULL);
Window xwindow;
screen = DefaultScreen(display);
xwindow = RootWindow(display,screen);
int i,j;
long rgb;
GC gr_context1=XCreateGC(display,xwindow,0,0);
for (i=0;i<255;i++) {
colourindex
[i
].
r = rand() % 256; colourindex
[i
].
g = rand() % 256; colourindex
[i
].
b = rand() % 256; colourindex
[i
].
junk = rand() % 256; }
if (bInfoHeader.colors > 0) {
for (i=0;i<bInfoHeader.colors;i++) {
if (fread(&colourindex
[i
].
b,sizeof(unsigned char),1,ftext
) != 1) { fprintf(stderr
,"Image read failed\n"); }
if (fread(&colourindex
[i
].
g,sizeof(unsigned char),1,ftext
) != 1) { fprintf(stderr
,"Image read failed\n"); }
if (fread(&colourindex
[i
].
r,sizeof(unsigned char),1,ftext
) != 1) { fprintf(stderr
,"Image read failed\n"); }
if (fread(&colourindex
[i
].
junk,sizeof(unsigned char),1,ftext
) != 1) { fprintf(stderr
,"Image read failed\n"); }
fprintf(stderr
,"%3d\t%3d\t%3d\t%3d\n",i
, colourindex[i].r,colourindex[i].g,colourindex[i].b);
}
gotindex = 0;
}
/* Nos desplazamos el valor de offset hasta llegar a la zona de los datos */
fseek(ftext
, header.
offset, SEEK_SET
);
/* Hay que invertir los indices porque la imagen se muestra al reves*/
for(j=(bInfoHeader.height) -1;j>=0;j--) {
for(i=0;i<bInfoHeader.width;i++) {
switch(bInfoHeader.bpp) {
case 1:
break;
case 4:
break;
case 8:
if(fread(&junk
, sizeof(unsigned char), 1, ftext
)!=1){
}
if(gotindex){
}
else {
}
break;
case 24:
if(fread(&b
, sizeof(unsigned char), 1, ftext
)!=1){
}
if(fread(&g
, sizeof(unsigned char),1, ftext
)!=1){
}
if(fread(&r
, sizeof(unsigned char),1, ftext
)!=1){
}
/*Obtenemos el valor del color a partir del RGB*/
rgb=65536 * r + 256 * g + b;
/*Marcamos el color obtenido*/
XSetForeground(display, gr_context1, rgb);
/*Dibujamos el punto correspondiente*/
XDrawPoint(display, xwindow, gr_context1, i, j);
break;
}
}//i
}//j
}
Un saludo