我正在尝试将包含字符的缓冲区中的数据复制到结构中。缓冲区仅包含结构的蓝色,绿色和红色成员的数据 - 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.
}
}
答案 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,而不必自己处理原始图像数据。