如何将我的数据从缓冲区中获取到此结构中?

时间:2013-06-30 04:02:56

标签: c

我正在尝试将包含字符的缓冲区中的数据复制到结构中。缓冲区仅包含结构的蓝色,绿色和红色成员的数据 - alpha将设置为零。代码如下,但我似乎无法弄清楚循环。

   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.
            }   
    }   

1 个答案:

答案 0 :(得分: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所述,如果位图数据没有alpha通道,这当然不起作用。此外,有些图像每像素的位数较少,或根本没有RGB数据(而是有颜色表的索引,通常是256色或更少的图像)。

您可能希望找到一个能够处理所有这些内容的库,并提供与您无关的格式化API,而不必自己处理原始图像数据。