0

ビットマップ ファイルの色を反転するアプリケーションを作成しようとしていますが、実際にビットマップからデータを収集する際に問題が発生しています。ビットマップとヘッダーのデータを保持するために構造体を使用しています。今私は持っています:

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

ここから、ヘッダー情報をヘッダー構造に抽出するにはどうすればよいですか?

また、ビットマップの読み取りと書き込みに関する優れたリソースがあれば、お知らせください。私は何時間も検索してきましたが、このトピックに関する有用な情報があまり見つかりません.

4

1 に答える 1

0

実際には、すべてのデータが正しい場所に既にあるはずです。間違っている可能性がある唯一の問題は、エンディアンである可能性があります。たとえば、0x01 0x00 または 0x00 0x01 として "short" で表される数値 256 です。

編集:構造体の構文に関連する何か問題があります...

 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

このようにして、データを構造体の途中に直接読み込むことができますが、エンディアンの問題が発生する可能性は依然としてあります。

于 2012-10-23T05:54:04.283 に答える