-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

そこで、3 つの異なる jpg から、それぞれ異なるピクセル数を持つ 3 つの異なる bmp ファイルを作成しました。

  1. ヘッダー情報、または基本的には各ピクセルの色は、138 バイトのデータの後に表示され始めます。
  2. Mark Random はパディングについて正しく提案しました。各行にはバイト数として 4 の倍数が必要です。
  3. パディングされたバイトは、値 0 を取得します。

上記の結論は、私が取った事例に基づいており、決して一般化されていません. それが役に立てば幸い。

于 2013-04-20T09:48:27.730 に答える