Escribí un código para simplemente leer/escribir (copiar) un *.archivo bmp. Pero algo está mal mi programa se ejecuta una y otra y otra vez … me refiero a que parece que hay un while(true) bucle dentro o algo. Heres mi código:

#include <stdio.h>
#include <stdlib.h>
#pragma pack(push, 1)
typedef struct Pix
{
unsigned char R;
unsigned char G;
unsigned char B;
unsigned char L;
int BW;
}Pix;
#pragma pack(pop)
#pragma pack(push, 1)
typedef struct BitMap
{
short Signature;
long Reserved1;
long Reserved2;
long DataOffSet;
long Size;
long Width;
long Height;
short Planes;
short BitsPerPixel;
long Compression;
long SizeImage;
long XPixelsPreMeter;
long YPixelsPreMeter;
long ColorsUsed;
long ColorsImportant;
struct Pix *pixels
}BitMap;
#pragma pack(pop)
int main(int argc, char **argv)
{
unsigned long int i=0;//to count pixels readed
unsigned long int S=0;//number of pixcels to read
struct BitMap source_info;//to store bitmap info header
struct Pix source_pix;//to store pixcels
FILE *fp;//file pointer for source file
FILE *Dfp;//file ponter for distenation file
if(!(fp=fopen("in.bmp","rb")))//open in binery read mode
{
printf(" can not open file");//prind and exit if file open error
exit(-1);
}
Dfp=fopen("out.bmp","wb");//opne in binery write mode
//read the headers to souirce file
fread(&source_info, (sizeof(long)*3 + sizeof(short)),1,fp);
//calucate the number of pix to read
S=source_info.Width*source_info.Height;
source_info.pixels =  (struct Pix *) malloc(sizeof(struct Pix)*S);
//read pixcels
for(i=1;i<=S;i++)
{
//read pixcel form source file
fread(&source_pix,sizeof(struct Pix),1,fp);
source_info.pixels[i-1] = source_pix;
}
//write header to dest file
fwrite(&source_info,  (sizeof(long)*3 + sizeof(short)),1,Dfp);
//write pixels to dest file
for(i=1;i<=S;i++)
{
fwrite(&source_info.pixels[i-1],sizeof(struct Pix),1,Dfp);
}
//close all fiels
fclose(fp);
fclose(Dfp);
return 0;
}
  • Usted no debe leer/escribir archivos binarios mediante FILE*, en lugar de usar sistema de escritura/lectura-llamadas.
  • ampliado mi respuesta.
  • Para referencia sobre las distintas posibilidades de información puede ser almacenada en lo que se llama un archivo bmp: en.wikipedia.org/wiki/BMP_file_format
  • La estructura BitMap publicado sólo lo hará para los sistemas con el tamaño de un long de 32 bits.
InformationsquelleAutor Brian Brown | 2013-02-22

3 Comentarios

  1. 3

    El número de píxeles de leer (S) es 3762821376 para una muestra de la imagen que he intentado. Que es obviamente muy grande.

    Tener una mirada en el BMP-spec si el struct BitMap está utilizando es el correcto.

    EDITAR 1:

    Cambiar estos:

    fread(&source_info, (sizeof(long)*3 + sizeof(short)),1,fp);
    ...
    fwrite(&source_info,  (sizeof(long)*3 + sizeof(short)),1,Dfp);

    a

    fread(&source_info, sizeof(source_info),1,fp);
    ...
    fwrite(&source_info, sizeof(source_info),1,Dfp);

    Ahora copias de mi prueba .bmp bien.

    EDIT 2:

    Creo que el color de conmutación de problemas en su máquina viene porque no source_info.pixels = .... Usted debe usar su propio puntero Pix* pixels = malloc... y en los bucles de cambio source_info.pixels a pixels. Simplemente no ceder su malloc en el source_info struct y que debería estar bien

    • cambiado como usted escribió, pero ahora otro problema que surgió. Se copia una imagen bmp pero cambia los colores también :/ check out el código de este ejemplo de la imagen: imageshack.us/photo/my-images/208/39057820.png
    • Mis colores no cambie!
    • extraño, porque el mío no, echa un vistazo: imageshack.us/photo/my-images/266/ouuut.png a su salida de la imagen, fuera.bmp
    • Creo que el color de conmutación de problemas en su máquina viene porque no source_info.pixels = .... Usted debe usar su propio puntero Pix* pixels = malloc... y en los bucles de cambio source_info.pixels a pixels. Sólo no asignar su malloc en el source_info struct y que debería estar bien.
    • ayudó, gracias! pero por desgracia tengo que tener en un struct, de mapa de bits. Cómo hacerlo?
    • Siempre se puede envolver otra estructura que la rodea: el typedef struct { BitMap header; void* pixels; } HeaderAndPixels; . Por cierto: el mapa de bits de encabezado de la estructura no está completo! Se echa de menos algunos campos de ver aquí: en.wikipedia.org/wiki/BMP_file_format

  2. 1

    Que usted está accediendo a la source_info.Width y source_info.Height datos que no inited porque cuando fread los datos de cabecera del archivo, que acaba de dejar después de la primera 4 fields.

    Por lo tanto el otro campo de source_info podría contener datos no deseados. (especialmente la width y height causa en la que afectan a la próxima bucles)

    Asegúrese de leer el encabezado completo cambio de

    fread(&source_info, (sizeof(long)*3 + sizeof(short)),1,fp);

    con

    fread(&source_info, sizeof(BitMap),1,fp);

    a continuación, asegúrese de desecharlo correctamente por la misma razón, chainging

    fwrite(&source_info,  (sizeof(long)*3 + sizeof(short)),1,Dfp);

    con

    fwrite(&source_info, sizeof(BitMap),1,Dfp);
  3. 0

    Usted necesita para omitir la copia del Pix puntero, a mí me funciona dentro de una sola estructura, como usted quería.

    fread(&source_info, (sizeof(BitMap) - sizeof(struct Pix*)),1,fp);

    Por la forma, el código produce tamaños de archivo más pequeños si se definen los Pix

    typedef struct Pix
    {
    unsigned char R;
    unsigned char G;
    unsigned char B;
    }Pix;

Dejar respuesta

Please enter your comment!
Please enter your name here