2013-06-30 22 views
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. 
      } 
    } 
+0

如果您确定fread正在读取值,则循环完全正常。如果我没有错,这是使用libbmp,不是吗? –

+2

我不明白你是如何访问缓冲区的第一个地方...... –

+0

是的,我使用libbmp。 –

回答

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供您使用,而不必亲自处理原始图像数据。

+0

+1为一个理智的fread! :) –

+1

要小心 - 如果图像是每个像素打包24位,并且您尝试读取每像素32位,您的解决方案将无法工作。 –

+0

我怎么解释? –

相关问题