2012-10-23 5 views
0

J'essaie de créer une application qui inverse les couleurs d'un fichier bitmap mais qui rencontre des problèmes pour rassembler les données et le bitmap. J'utilise des structures pour conserver les données pour le bitmap et son en-tête. En ce moment je:Lecture et écriture de bitmaps dans c

struct 
{ 
    uint16_t type; 
    uint32_t size; 
    uint32_t offset; 
    uint32_t header_size; 
    int32_t width; 
    int32_t height; 
    uint16_t planes; 
    uint16_t bits; 
    uint32_t compression; 
    uint32_t imagesize; 
    int32_t xresolution; 
    int32_t yresolution; 
    uint32_t ncolours; 
    uint32_t importantcolours; 
} header_bmp 

struct { 
    header_bmp header; 
    int data_size; 
    int width; 
    int height; 
    int bytes_per_pixel; 
    char *data; 
} image_bmp; 

Maintenant, pour la lecture et l'écriture en fait le bitmap que je donne les résultats suivants:

image_bmp* startImage(FILE* fp) 
{ 
header_bmp* bmp_h = (struct header_bmp*)malloc(sizeof(struct header_bmp)); 
ReadHeader(fp, bmp_h, 54); 
} 

void ReadHeader(FILE* fp, char* header, int dataSize) 
{ 
fread(header, dataSize, 1, fp); 
} 

De là, comment dois-je extraire les informations d'en-tête dans ma structure d'en-tête?

De même, si quelqu'un a de bonnes ressources sur la lecture et l'écriture de bitmaps, s'il vous plaît faites le moi savoir. J'ai cherché pendant des heures et ne peux pas trouver beaucoup d'informations utiles sur le sujet.

Répondre

0

Vous devriez déjà avoir toutes les données dans les bons endroits. Le seul problème peut-être mal tourné pourrait être endianness. par exemple. est le nombre 256 représenté en "court" comme 0x01 0x00 ou 0x00 0x01.

EDIT: il y a quelque chose de mal lié à la syntaxe des struct ...

struct name_of_definition { int a; int b; short c; short d; }; 
struct name_of_def_2 { struct name_of_definition instance; int a; int b; } 
    *ptr_to_instance; // or one can directly allocate the instance it self by 
         // by omitting the * mark. 
struct { int b; int c; } instance_of_anonymous_struct; 

ptr_to_instance = malloc(sizeof(struct name_of_def_2)); 

aussi:

ReadHeader(fp, (char*)&ptr_to_instance->header, sizeof(struct definition)); 
      // ^don't forget to cast to the type accepted by ReadHeader 

De cette façon, vous pouvez lire directement les données dans le milieu de la struct, mais la question possible de l'endianness se cache toujours autour.