0

文字を含むバッファから構造体にデータをコピーしようとしています。バッファーには、構造体の青、緑、および赤のメンバーのデータのみが含まれます。アルファはゼロに設定されます。コードは次のとおりですが、ループが理解できないようです。

   typedef struct __attribute__((packed)){
      uint8_t blue;
      uint8_t green;
      uint8_t red;
      uint8_t alpha;
   } rgb_pixel_t;

    int i, j;
    char *buffer; 
    buffer = malloc(sizeof(rgb_pixel_t) * bmp->dib.width); 

    bmp_malloc_pixels(bmp);
    rgb_pixel_t pixel = {42, 42, 42, 0}; 

    fseek(fp, bmp->header.offset, SEEK_SET);
    fread(buffer, sizeof(char), ((bmp->dib.depth / 8) * bmp->dib.width), fp);

    for(i = 0; i < 600; ++i) {
            for(j = 0; j < 400; ++j) {
                    bmp_set_pixel(bmp, i, j, pixel); // This isn't right.
            }   
    }   
4

1 に答える 1

3

そのようにしないでください。charバッファを用意する代わりに、バッファrgb_pixel_tを用意して、そこに読み込みます:

rgb_pixel_t *pixels = malloc(sizeof(rgb_pixel_t) * bmp->dib.width);

/* ... */

size_t pixels_to_read = bmp->dib.depth / 8 * bmp->dib.width / sizeof(rgb_pixel_t);
fread(pixels, sizeof(rgb_pixel_t), pixels_to_read, fp);

/* ... */

コメントでDrew McGowenが指摘したように、ビットマップ データにアルファ チャネルがない場合、これはもちろん機能しません。また、ピクセルあたりのビット数が少ない画像や、RGB データがまったくない画像もあります (代わりに、カラー テーブルへのインデックスがあり、通常は 256 色以下の画像です)。

生の画像データを自分でいじる代わりに、それらすべてを処理するライブラリを見つけて、使用する形式に依存しない API を提供することをお勧めします。

于 2013-06-30T04:11:03.797 に答える