0

我正在尝试将包含字符的缓冲区中的数据复制到结构中。缓冲区仅包含结构的蓝色、绿色和红色成员的数据 - 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.
            }   
    }   
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在评论中指出的那样,如果位图数据没有 Alpha 通道,这当然不起作用。此外,有些图像的每像素位数较少,或者根本没有 RGB 数据(而是有颜色表的索引,通常是 256 色或更少颜色的图像)。

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

于 2013-06-30T04:11:03.797 回答