在c中读取和写入位图

时间:2012-10-23 05:50:14

标签: c bitmap bmp

我正在尝试创建一个反转位图文件颜色的应用程序,但在实际收集数据和位图方面遇到了一些麻烦。我正在使用结构来保存位图的数据和它的标题。现在我有:

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;

现在实际读取和写入位图我有以下内容:

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);
}

从这里如何将标题信息提取到我的标题结构中?

如果有人在阅读和编写位图方面有任何好的资源,请告诉我。我一直在搜索几个小时,但找不到有关该主题的有用信息。

1 个答案:

答案 0 :(得分:0)

您实际上应该已经将所有数据放在正确的位置。可能出错的唯一问题可能是 endianness 。例如是以“短”表示的数字256 0x01 0x00或0x00 0x01。

编辑:与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));

也:

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

通过这种方式,您可以直接将数据读入结构的中间,但可能存在的字节序问题仍然存在。