2

私は画像処理をいじり始め、画像処理ライブラリを使用せずにグレースケール画像を作成する方法があるかどうかを知りたがっていました.グレースケール画像を作成したい
これはコードです:

#include <stdio.h>
int main(){
FILE * binary = fopen("C:/Arabidopsis3.bmp", "rb");
FILE * bCopy=fopen("C:/copy.bmp","wb");
int get_char;
int i=3;
while ((get_char=fgetc(binary))!= EOF)
 {
if(i>3)
    {
                 doing the grayscale process
             }
    fputc(get_char, bCopy);
    i++;
  }
  fclose(binary);
  fclose(bCopy);
  return 0;
 }

ご覧のとおり、bmp を copy.bmp にコピーしていますが、copy.bmp はグレースケールである必要があります。助言がありますか?

4

2 に答える 2

2

まず、BMP ファイル形式には (メモリではなく) 削除されるヘッダー ファイルがあります。ヘッダーの後に、固定サイズのメモリ領域がありますが、この次の領域には 7 つの異なる形式があります: http://en.wikipedia.org/wiki/BMP_file_format

フォーマットを決定してから、各ピクセルに必要なバイト数を決定する必要があります。次に、ピクセル記述形式を知る必要があります。

ちょっとした調査を行うだけで、これはすべて非常に簡単です。ファイル形式については詳しくありませんが、構造さえわかれば簡単にできるはずです。

編集:

各ピクセル値がどこにあるかがわかっている場合は、ポインターを使用してピクセル配列に沿って歩くだけでそれらを抽出できるはずです。たとえば、画像に 8 ピクセルがあり、各ピクセルが 8 バイトで定義されていることがわかっている場合、ピクセル配列セクションの先頭に 8 バイト ポインターを配置してから、8 バイト ポインターを使用してピクセル配列をたどることができます。あなたの Xor を実行します。何かをグレースケールにする方法が正確にはわかりません。すべての色の値を取り除くだけだと思います。そのため、最初のバイトがグレースケールを表し、残りがカラーデータである場合、カラーデータを取得して、それらのビットが 0 に設定されていることを確認します。

于 2013-05-10T17:11:10.877 に答える
0

これが Windows ビットマップの場合、構造化されていないアプローチはお勧めできません。bmp ファイルの操作に関する情報については、Windows SDK を参照することをお勧めします。正しい方向を示すキーワード: BITMAPINFOHEADER、 GetDIBits/SetDIBits。また、GDI+ には、画像の読み込みと保存に非常に便利なラッパーがいくつかあります。

于 2013-05-10T17:12:24.007 に答える