/*
    http://i...content-available-to-author-only...e.com/fskVl3

    http://t...content-available-to-author-only...h.net/test/read.cgi/tech/1349527750/951
     > [1] 授業単元：2値化
     > [2] 問題文(含コード&リンク)：
     > http://i...content-available-to-author-only...e.com/fskVl3
     > 画像読み込み→2値化→2値化した画像を表示するプログラムを作成せよ
     > 画像読み込みまでは出来ましたが、2値化がよくわかりませんでした。
     > フルカラー前提でRGBの全チャンネルが同値なら濃淡画像に変換され、その濃淡画像を閾値処理によって2値にするらしいですがその辺がよくわかりません
     > [3] 環境 
     > 　[3.1] OS：Windows7
     > 　[3.2] コンパイラ名とバージョン：VS2010
     > 　[3.3] 言語：C
     > [4] 期限：12/1
     > [5] その他の制限：出来るだけ標準ライブラリでお願いします 
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define WIDTH  (640)
#define HEIGHT (480)
#define BMP_HEADER_SIZE     (54)
#define INPUT_IMAGE_FILE    "image.bmp"
#define OUT_IMAGE_FILE      "image2.bmp"
#define OUT_IMAGE_COMMAND   "start" // image 出力コマンド
//#define OUT_IMAGE_COMMAND   "eog"   // Linux Gnome の「Eye of GNOME」を使う場合

typedef struct color {
    unsigned char r;            // 入力画像 赤
    unsigned char g;            //          緑
    unsigned char b;            //          青
    int v;                      // 出力画像 2値 (0 or 1)
} COLOR;

int main()
{
    int i, j;
    unsigned char sikiichi = 0x80;  // しきい値(これ以上なら白、未満なら黒)
    unsigned char head[BMP_HEADER_SIZE];    // BMPヘッダ
    static COLOR data[WIDTH][HEIGHT], *pColor;  // データ
    FILE *fp;                   // ファイル

    // init
    memset(data, 0x00, sizeof(data));

    // read
    if ((fp = fopen(INPUT_IMAGE_FILE, "rb")) == NULL) {
        fprintf(stderr, "file open error\n");
        exit(1);
    }
    rewind(fp);
    fread(head, BMP_HEADER_SIZE, 1, fp);
    for (j = HEIGHT - 1; j >= 0; j--) {
        for (i = 0; i < WIDTH; i++) {
            pColor = &data[i][j];
            pColor->b = getc(fp);
            pColor->g = getc(fp);
            pColor->r = getc(fp);
        }
    }
    fclose(fp);

    // 2値計算
    for (j = HEIGHT - 1; j >= 0; j--) {
        for (i = 0; i < WIDTH; i++) {
            pColor = &data[i][j];
            // ※ RGB値が同値でないドットは「黒」とする
            if ((pColor->b == pColor->g) && (pColor->g == pColor->r) && (sikiichi <= pColor->r)) {
                data[i][j].v = 1;
            }
        }
    }

    // 画像出力
    fp = fopen(OUT_IMAGE_FILE, "wb");
    fwrite(head, BMP_HEADER_SIZE, 1, fp);
    for (j = HEIGHT - 1; j >= 0; j--) {
        for (i = 0; i < WIDTH; i++) {
            if (data[i][j].v) {
                putc(0xFF, fp);
                putc(0xFF, fp);
                putc(0xFF, fp);
            } else {
                putc(0, fp);
                putc(0, fp);
                putc(0, fp);
            }
        }
    }
    fclose(fp);
    system(OUT_IMAGE_COMMAND " " OUT_IMAGE_FILE);

    // end
    return 0;
}