// ビットマップ処理 // #include "stdafx.h" #include "BitView.h" #include "MainFrm.h" #include "BitViewDoc.h" #include "BitViewView.h" #include "BitmapSyori.h" #include "math.h" #ifdef _DEBUG #define new DEBUG_NEW #endif void CBitmapSyori::ReadData(CArchive& ar, CString& fn, Color *col, int *nx, int *ny) { CFile *cf; ULONGLONG FileLen; unsigned char header; int i; int k = 0; int j = 0; int l = 0; int mmax; int m = 0; int flag = 0; *nx = 0; *ny = 0; //ファイル名と大きさを取得する cf = ar.GetFile(); fn = *cf->GetFileName(); FileLen = cf->GetLength(); //ファイルのデータを読み出す for (i = 0; i < FileLen; i++) { //情報の取り出し if (i<54) //x、yの最大値を調べる { //ヘッダーデータの読み込み ar >> header; switch (i){ case 18: *nx = header; break; case 19: *nx = *nx + header*256; break; case 22: *ny = header; break; case 23: *ny = *ny + header*256; break; } if (*nx > 580 || *ny > 580) { PostQuitMessage(1); return; } mmax = *nx % 4; } else //画像のピクセルデータの読み出し { //行変更区間かどうか if (k == *nx ) flag = 1; //情報の取り出し if (flag == 0) { switch (j){ case 0: ar >> col->dotblue[k][*ny - l]; j++; break; case 1: ar >> col->dotgreen[k][*ny - l]; j++; break; case 2: ar >> col->dotred[k][*ny - l]; j = 0; k++; break; } } if (flag == 1) { if (m < mmax) { m++; ar >> header; //ブランクデータを捨てる。 } else { m = 0; flag = 0; k = 0; l++; } } } } } void CBitmapSyori::Shirokuro(Color *col, int *nx, int *ny) { int i; int j; unsigned char shirokuro; for (i = 0; i < *nx; i++) { for (j = 0; j < *ny; j++) { shirokuro = (col->dotblue[i][j] + col->dotgreen[i][j] + col->dotred[i][j])/3; col->dotblue[i][j] = shirokuro; col->dotgreen[i][j] = shirokuro; col->dotred[i][j] = shirokuro; } } } void CBitmapSyori::Bibun(Color *col, int *nx, int *ny, int *c) { int i; int j; //メモリ節約のため、colの使わない変数をtempとして扱う //x方向に微分 for (i = 1; i < *nx; i++) { for (j = 0; j < *ny; j++) { switch (*c) { case 1: col->dotgreen[i][j] = col->dotred[i][j] - col->dotred[i-1][j]; break; case 2: col->dotblue[i][j] = col->dotgreen[i][j] - col->dotgreen[i-1][j]; break; case 3: col->dotred[i][j] = col->dotblue[i][j] - col->dotblue[i-1][j]; break; } } } //y方向に微分 for (i = 0; i < *nx; i++) { for (j = 1; j < *ny; j++) { switch (*c) { case 1: col->dotblue[i][j] = col->dotgreen[i][j] - col->dotgreen[i][j-1]; break; case 2: col->dotred[i][j] = col->dotblue[i][j] - col->dotblue[i][j-1]; break; case 3: col->dotgreen[i][j] = col->dotred[i][j] - col->dotred[i][j-1]; break; } } } //微分した結果を返す for (i = 0; i < *nx; i++) { for (j = 0; j < *ny; j++) { switch (*c) { case 1: col->dotred[i][j] = col->dotblue[i][j]; break; case 2: col->dotgreen[i][j] = col->dotred[i][j]; break; case 3: col->dotblue[i][j] = col->dotgreen[i][j]; break; } } } } void CBitmapSyori::Sekibun(Color *col, int *nx, int *ny, int *c) { int i; int j; for (i = 0; i < *nx; i++) { col->dotred[i][0] = 1; col->dotgreen[i][0] = 1; col->dotblue[i][0] = 1; } for (j = 0; j < *ny; j++) { col->dotred[0][j] = 1; col->dotgreen[0][j] = 1; col->dotblue[0][j] = 1; } //メモリ節約のため、colの使わない変数をtempとして扱う //x方向に積分 for (i = 1; i < *nx; i++) { for (j = 0; j < *ny; j++) { switch (*c) { case 1: col->dotgreen[i][j] = col->dotgreen[i-1][j] + col->dotred[i][j]; break; case 2: col->dotblue[i][j] = col->dotblue[i-1][j] + col->dotgreen[i][j]; break; case 3: col->dotred[i][j] = col->dotred[i-1][j] + col->dotblue[i][j]; break; } } } //y方向に積分 for (i = 0; i < *nx; i++) { for (j = 1; j < *ny; j++) { switch (*c) { case 1: col->dotblue[i][j] = col->dotblue[i][j-1] + col->dotgreen[i][j]; break; case 2: col->dotred[i][j] = col->dotred[i][j-1] + col->dotblue[i][j]; break; case 3: col->dotgreen[i][j] = col->dotgreen[i][j-1] + col->dotred[i][j]; break; } } } //積分した結果を返す for (i = 0; i < *nx; i++) { for (j = 0; j < *ny; j++) { switch (*c) { case 1: col->dotred[i][j] = col->dotblue[i][j]; break; case 2: col->dotgreen[i][j] = col->dotred[i][j]; break; case 3: col->dotblue[i][j] = col->dotgreen[i][j]; break; } } } } void CBitmapSyori::Psudocolor(Color *col, int *nx, int *ny) { int i; int j; double a = 0.003845; double b = -0.294118; double d = 255.; unsigned char s; for (i = 0; i < *nx; i++) { for (j = 0; j < *ny; j++) { s = (col->dotblue[i][j] + col->dotgreen[i][j] + col->dotred[i][j])/3; if (s >= 0 && s < 51) { col->dotred[i][j] = (unsigned char)(a*s*s*s + b*s*s + d); col->dotgreen[i][j] = 0; col->dotblue[i][j] = 255; } if (s >= 51 && s < 102) { col->dotred[i][j] = 0; col->dotgreen[i][j] = (unsigned char)((-1)*a*(s-102.)*(s-102.)*(s-102.) + b*(s-102.)*(s-102.) + d); col->dotblue[i][j] = 255; } if (s >= 102 && s < 153) { col->dotred[i][j] = 0; col->dotgreen[i][j] = 255; col->dotblue[i][j] = (unsigned char)(a*(s-102)*(s-102)*(s-102) + b*(s-102)*(s-102) + d); } if (s >= 153 && s < 204) { col->dotred[i][j] = (unsigned char)((-1)*a*(s-204)*(s-204)*(s-204) + b*(s-204)*(s-204) + d); col->dotgreen[i][j] = 255; col->dotblue[i][j] = 0; } if (s >= 204 && s < 256) { col->dotred[i][j] = 255; col->dotgreen[i][j] = (unsigned char)(a*(s-204)*(s-204)*(s-204) + b*(s-204)*(s-204) + d); col->dotblue[i][j] = 0; } } } }