質問
BMP イメージの読み取りについて質問がありました。BMP 画像のピクセル値 (R、G、B 値) を取得するにはどうすればよいですか?C プログラミング言語の使用を手伝ってくれる人はいますか?
解決
簡単な方法は、選択したプラットフォームに適した画像操作ライブラリを見つけてそれを使用することです。
- Linux イムリブ / GDK-Pixbuf (Gnome/GTK) / QT イメージ (KDE/Qt) 必要なことはできるはずです。
- ウィンドウズ 適切なシステム ライブラリについては詳しくありませんが、 MSDN で「ビットマップ」を検索 おそらくここから始めるのが良いでしょう。
- マックOSX Cocoa にはいくつかの画像操作機能があります。を参照してください。 この記事.
難しい方法は、ファイルを開いて、その中のバイナリ データを実際に解釈することです。そのためには、 BMP ファイルの仕様. 。まずは簡単な方法から試してみることをお勧めします。
他のヒント
注:あなたはあなたのBMPは、アルファチャンネルを持っている場合、アルファ値のための余分なバイトをつかむ必要があるかもしれません。その場合、画像はimage[pixelcount][4]
だろう、とあなたはその第四のインデックスを保持するために、別のgetc(streamIn)
行を追加します。私のBMPはそれを必要としないことが判明します。
// super-simplified BMP read algorithm to pull out RGB data
// read image for coloring scheme
int image[1024][3]; // first number here is 1024 pixels in my image, 3 is for RGB values
FILE *streamIn;
streamIn = fopen("./mybitmap.bmp", "r");
if (streamIn == (FILE *)0){
printf("File opening error ocurred. Exiting program.\n");
exit(0);
}
int byte;
int count = 0;
for(i=0;i<54;i++) byte = getc(streamIn); // strip out BMP header
for(i=0;i<1024;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("pixel %d : [%d,%d,%d]\n",i+1,image[i][0],image[i][1],image[i][2]);
}
fclose(streamIn);
〜Locutus
BMP ファイル形式について勉強する必要があります。非圧縮の 24 ビット BMP ファイルを読み取る方が簡単です。これらには、先頭のヘッダーと各ピクセルの RGB 値が含まれるだけです。
まず、2x2 ビットマップ イメージの例を次のサイトで確認してください。 http://en.wikipedia.org/wiki/BMP_file_format. 。以下の手順に従ってください。
- Wikipedia に記載されている 2x2 BMP イメージを作成します。
- C プログラムを使用して、バイナリ モードでファイルを開きます。
- バイト位置 54 までシークします。
- 3バイトを読み取ります。
バイトはそれぞれ 0、0、255 になります。(順番がRGBかどうかは不明。これはかなり前にやったことがありますが、順序が RGB ではなかったと思います。これだけは確認してください。)
とてもシンプルです!BMP のヘッダーを調べて、形式について詳しく理解してください。