从bmp文件中获取每个像素的RGB值

时间:2013-04-17 13:35:12

标签: c image-processing bmp

所以我有一个bmp文件,我想为图像的每个像素提取rgb的细节。

我在某处读到以下内容会为我做这件事

int main(){
int image[100][3]; // first number here is 100 pixels in my image, 3 is for RGB     values
 FILE *streamIn;
 int i;
 streamIn = fopen("./t.bmp", "r");
 if (streamIn == (FILE *)0){
    printf("File opening error ocurred. Exiting program.\n");
    return 0;
 }

  int byte;
  int count = 0;
  for(i=0;i<54;i++) byte = getc(streamIn);  // strip out BMP header

  for(i=0;i<100;i++){    // foreach pixel
     image[i][2] = getc(streamIn);  // use BMP 24bit with no alpha channel
     image[i][1] = getc(streamIn);  // BMP uses BGR but we want RGB, grab byte-by-byte
     image[i][0] = getc(streamIn);  // reverse-order array indexing fixes RGB issue...
     //printf("[%d,%d,%d] ",image[i][0],image[i][1],image[i][2]);
     if(image[i][0]==255 && image[i][1]==255 && image[i][2]==255)
        printf("B");
     else if(image[i][0]==0 && image[i][1]==0 && image[i][2]==0)
        printf("W");
     else{
        printf("[%d,%d,%d]",image[i][0],image[i][1],image[i][2]);
        //return 0;
     }
  }

  fclose(streamIn);
  return 0;
 }

现在考虑我的bmp文件是10 * 10像素,上面的方法会起作用吗?

编辑我添加了答案,也许可以帮助某人。欢呼声。

2 个答案:

答案 0 :(得分:2)

此代码示例非常粗糙,我不建议这样做。

但是,如果你坚持,你需要知道一条规则:每行填充到4个字节的精确倍数。在你的情况下,一行是10 * 3或30字节,因此它获得2个额外的填充字节。如果您在阅读文件时没有考虑到这一点,那么您将会离开。

答案 1 :(得分:0)

所以我从三个不同的jpg创建了三个不同的bmp文件,每个都有不同的像素数,这就是我发现的。

  1. 标题信息,或基本上每个像素的颜色,开始出现在138个字节的数据之后。
  2. Mark Random正确建议填充,每行必须有4的倍数作为字节数。
  3. 填充字节,得到值0.
  4. 上述结论是基于我所采用的实例,绝不是一般化的。希望它有所帮助。