-2

所以我有一个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 像素,上述方法可以工作吗?

编辑我添加了一个答案,也许这可以帮助某人。干杯。

4

2 回答 2

2

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

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

于 2013-04-17T15:35:20.077 回答
0

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

  1. 标题信息,或者基本上是每个像素的颜色,在 138 字节数据之后开始出现。
  2. Mark Random 正确地建议了填充,每行的字节数必须是 4 的倍数。
  3. 填充字节,获取值 0。

以上结论是基于我所举的实例,绝不是一概而论。希望能帮助到你。

于 2013-04-20T09:48:27.730 回答