Estoy tratando de trabajar en un archivo bmp. Para empezar Traté de leer una cabecera y un datos de un archivo BMP y escribirlo en un archivo nuevo:lectura/escritura de archivos bmp en c
#pragma pack(push,1)
/* Windows 3.x bitmap file header */
typedef struct {
char filetype[2]; /* magic - always 'B' 'M' */
unsigned int filesize;
short reserved1;
short reserved2;
unsigned int dataoffset; /* offset in bytes to actual bitmap data */
} file_header;
/* Windows 3.x bitmap full header, including file header */
typedef struct {
file_header fileheader;
unsigned int headersize;
int width;
int height;
short planes;
short bitsperpixel; /* we only support the value 24 here */
unsigned int compression; /* we do not support compression */
unsigned int bitmapsize;
int horizontalres;
int verticalres;
unsigned int numcolors;
unsigned int importantcolors;
} bitmap_header;
#pragma pack(pop)
int foo(char* input, char *output) {
//variable dec:
FILE *fp,*out;
bitmap_header* hp;
int n;
char *data;
//Open input file:
fp = fopen(input, "r");
if(fp==NULL){
//cleanup
}
//Read the input file headers:
hp=(bitmap_header*)malloc(sizeof(bitmap_header));
if(hp==NULL)
return 3;
n=fread(hp, sizeof(bitmap_header), 1, fp);
if(n<1){
//cleanup
}
//Read the data of the image:
data = (char*)malloc(sizeof(char)*hp->bitmapsize);
if(data==NULL){
//cleanup
}
fseek(fp,sizeof(char)*hp->fileheader.dataoffset,SEEK_SET);
n=fread(data,sizeof(char),hp->bitmapsize, fp);
if(n<1){
//cleanup
}
//Open output file:
out = fopen(output, "w");
if(out==NULL){
//cleanup
}
n=fwrite(hp,sizeof(char),sizeof(bitmap_header),out);
if(n<1){
//cleanup
}
fseek(out,sizeof(char)*hp->fileheader.dataoffset,SEEK_SET);
n=fwrite(data,sizeof(char),hp->bitmapsize,out);
if(n<1){
//cleanup
}
fclose(fp);
fclose(out);
free(hp);
free(data);
return 0;
}
Este es el archivo de entrada:
y esto es la salida :
Son del mismo tamaño y parece que tienen los mismos encabezados. ¿Qué puede estar mal? Gracias.
Los datos de píxeles de mapa de bits deben alinearse en filas de 32 bits. ¿Estás seguro de que este no es el problema? – TheZ
@TheZ: los datos de imagen consisten en tres bytes por píxel en b, g, r orden. Los datos se almacenan en orden de fila, fila tras fila, y cada fila se rellena con ceros a una longitud que es un múltiplo de 4 bytes. Solo escribo lo que he leído. ¿Es un problema? – Sanich
Bien, luego abre los dos archivos en un editor hexadecimal y compara. Una mirada rápida revela que son diferentes en longitud y datos después del encabezado. – TheZ