// ** View2D クラスの使用方法 (View2D.txt) // ** クラス:Array, Color, View2D // ** // ** 著作権者:東京工芸大学 工学部 メディア画像学科 降旗 隆 T.Furuhata (2007.9) // ******** Array クラス ************************************************************************** // ** i 行、j 列の double 型二次元配列 Array(i, j) を提供するクラス class Array aa(); // ******** Array クラスのメンバー関数 ************************************************************ // ** 二次元配列の初期化:i 行, j 列の動的二次元配列を生成(引数付きコンストラクタ) Array aa(int i, int j); // ** 二次元配列にデータを格納する aa.put(int i, int j) = (double)x; // ** 二次元配列からデータを取得する double x = aa.get(int i, int j); // ** 二次元配列の先頭アドレスを取得する double* y = aa.ArrayP(); // ** 二次元配列用のメモリを解放 aa.del(); // ******** Color クラス ************************************************************************** // ** グラフィックスの描画色を指定するクラス class Color cc(); // ******** Color クラスのメンバー関数 ************************************************************ // ** コンストラクタ[描画色:黒を指定] Color cc(); // ** 引数付きコンストラクタ[描画色 r, g, b の飽和度を 0.0 〜 1.0 で指定] Color cc(double r, double g, double b); // ******** Color クラスのフレンド関数 ************************************************************ // ** 彩度・加色変換 Color ca = (double)a * cc; ← friend Color operator*(double a, Color cc); Color cb = cc * (double)b; ← friend Color operator*(Color cc, double b); Color cd = cc / (double)d; ← friend Color operator/(Color cc, double b); Color cp = ca + cb; ← friend Color operator+(Color ca, Color cb); // ******** Color クラスの色の定義 **************************************************************** // R G B 1.0 は色飽和度 100% (255 レベル) に対応 #define WHITE Color(1.0, 1.0, 1.0) // ホワイト (白色) #define YELLOW Color(1.0, 1.0, 0.0) // イエロー (黄色) #define CYAN Color(0.0, 1.0, 1.0) // シアン (水色) #define GREEN Color(0.0, 1.0, 0.0) // グリーン (緑色) #define MAGENTA Color(1.0, 0.0, 1.0) // マゼンタ (紫色) #define RED Color(1.0, 0.0, 0.0) // レッド (赤色) #define BLUE Color(0.0, 0.0, 1.0) // ブルー (青色) #define BLACK Color(0.0, 0.0, 0.0) // ブラック (黒色) #define GRAY Color(0.5, 0.5, 0.5) // グレー (灰色) #define DARKBLUE Color(0.1, 0.2, 0.3) // ダークブルー (暗青色) // ******** View2D クラス ************************************************************************* // ** ビットマップ画像処理とウィンドウ 2D グラフィックス描画を提供するクラス class View2D ww(); // ******** View2D クラスのメンバー関数 *********************************************************** // **** コンストラクタ **** View2D ww(); // **** 引数付きコンストラクタ **** // ** 画像サイズ imgsize.cx × imgsize.cy の画像処理用一次元動的配列を生成 View2D ww(CSize& imgsize); // ** クラス内でデバイスコンテキスト pDC を使って描画の準備 View2D ww(CDC* pDC); // ** ウィンドウサイズを CMainFrame::PreCreateWindow() の default 値で指定、 // ウィンドウ背景色(default は WHITE)を変更し、クラス内で pDC を使って描画の準備 View2D ww(CDC* pDC, HWND m_hWnd, Color c = WHITE); // ** m_hWnd のウィンドウサイズ (外枠サイズ:width×height) と背景色 c (default は白色)を指定し // クラス内で pDC で描画できるように準備 View2D ww(CDC* pDC, HWND m_hWnd, int width, int height, Color c = WHITE); // ** m_hWnd のウィンドウサイズ (外枠サイズ:width×height, スクリーン座標位置:x, y) と // 背景色 c (default は白色)を指定し、クラス内で pDC を使って描画の準備 View2D ww(CDC* pDC, HWND m_hWnd, int width, int height, int x, int y, Color c = WHITE); // ******** ビットマップ画像処理関数 ******** // **** BMP ファイルの読み込み **** // ** (#1) filepath のファイルを読み込みビットマップ情報をグローバル変数 HBMP に取得 ww.ReadBmp(CString filepath); // ** (#2) filepath のファイルを読み込みビットマップ情報を取得し引数 hBmp に渡す ww.ReadBmp(CString filepath, HBITMAP& hBmp); // **** double 型一次元配列使用の BMP フルカラー画像のロード **** // ** (#1) ReadBmp(#1) によりグローバル変数 HBMP に取得されるビットマップ情報から // 8bit のイメージデータを引数の double 型一次元配列 rr, gg, bb へロード // 一次元配列 rr, gg, bb は呼び出し側で動的に作成 ww.LoadBmp(double* rr, double* gg, double* bb); // ** (#2) ReadBmp(#1) により View2D クラスのグローバル変数 HBMP に取得されるビットマップ情報 // から 8bit のイメージデータを double 型一次元配列 rr, gg, bb へロード // 一次元配列 rr, gg, bb はこの関数内(View2D クラス)で動的に生成 ww.LoadBmp(void); // ** (#3) ReadBmp(#2) により取得される引数のビットマップ情報 hBmp から 8bit のイメージデータを // double 型一次元配列 rr, gg, bb へロード // 一次元配列 rr, gg, bb は呼び出し側で動的に作成 ww.LoadBmp(HBITMAP& hBmp, double* rr, double* gg, double* bb); // ** (#4) ReadBmp(#2) により取得される引数のビットマップ情報 hBmp から 8bit のイメージデータを // double 型一次元配列 rr, gg, bb へロード // 一次元配列 rr, gg, bb はこの関数内(View2D クラス)で動的に生成 ww.LoadBmp(HBITMAP& hBmp); // **** double 型二次元配列使用の BMP フルカラー画像のロード **** // ** (#1) ReadBmp(#1) により View2D クラスのグローバル変数 HBMP に取得されるビットマップ情報 // から 8bit のイメージデータを double 型二次元配列 RR, GG, BB へロード // 二次元配列 RR, GG, BB は呼び出し側で動的に作成 ww.LoadBmp2(Array RR, Array GG, Array BB); // ** (#2) ReadBmp(#2) により取得される引数のビットマップ情報 hBmp から 8bit のイメージデータを // double 型二次元配列 RR, GG, BB へロード // 二次元配列 RR, GG, BB は呼び出し側で動的に作成 ww.LoadBmp2(HBITMAP& hBmp, Array RR, Array GG, Array BB); // **** double 型一次元配列使用の BMP フルカラー画像のセーブ **** // ** (#1) 引数の double 型一次元配列 rr, gg, bb に取得されている imgsize のイメージデータを // クリップ処理、8bit 変換しイメージファイルにしてから filepath の BMP ファイルへセーブする // 一次元配列 rr, gg, bbは呼び出し側で動的に作成されイメージデータが格納されて引数で渡される ww.SaveBmp(CString filepath, CSize& imgsize, double* rr, double* gg, double* bb); // ** (#2) View2D クラス内の double 型一次元配列 rr, gg, bb に取得されている imgsize のイメージ // データをクリップ処理、8bit 変換しイメージファイルにしてから filepath の BMP ファイルへ // セーブする // 一次元配列 rr, gg, bb は View2D クラス内で動的に作成され呼び出し側でイメージデータを格納 ww.SaveBmp(CString filepath, CSize& imgsize); // **** double 型二次元配列使用の BMP フルカラー画像のセーブ **** // ** (#1) 引数の double 型二次元配列 RR, GG, BB に取得されている imgsize のイメージデータを // クリップ処理、8bit 変換しイメージファイルにしてから filepath の BMP ファイルへセーブする // 二次元配列 RR, GG, BBは呼び出し側で動的に作成されイメージデータが格納されて引数で渡される ww.SaveBmp2(CString filepath, CSize& imgsize, Array RR, Array GG, Array BB); // **** double 型一次元配列使用の BMP フルカラー画像の DIBSECTION セーブ **** // ** (#1) 引数の double 型一次元配列 rr, gg, bb に取得されている imgsize のイメージデータを // クリップ処理、8bit 変換しイメージファイルにしてから // そのビットマップ情報をグローバル変数 HBMP の DIBSECTION にセーブ // 一次元配列 rr, gg, bbは呼び出し側で動的に作成されイメージデータが格納されて引数で渡される ww.SaveDib(CSize& imgsize, double* rr, double* gg, double* bb); // ** (#2) 引数の double 型一次元配列 rr, gg, bb に取得されている imgsize のイメージデータを // クリップ処理、8bit 変換しイメージファイルにしてから // そのビットマップ情報を引数 hBmp の DIBSECTION にセーブ // 一次元配列 rr, gg, bbは呼び出し側で動的に作成されイメージデータが格納されて引数で渡される ww.SaveDib(CSize& imgsize, double* rr, double* gg, double* bb, HBITMAP& hBmp); // **** BMP ファイルの書き込み **** // ** (#1) ReadBmp(#1) により View2D クラスのグローバル変数 HBMP に取得されるビットマップ情報 // からイメージファイルを作成して filepath のファイルに書き込む ww.WriteBmp(CString filepath); // ** (#2) ReadBmp(#2) により引数 hBmp に取得されるビットマップ情報から // イメージファイルを作成して filepath のファイルに書き込む ww.WriteBmp(CString filepath, HBITMAP& hBmp); // ** (#1) ReadBmp(#1) により View2D クラスのグローバル変数 HBMP に取得されるビットマップ情報 // から filepath のファイルに書き込む ww.WriteBmpx(CString filepath) // **** BMP 画像の描画 **** // ** (#1) ReadBmp(#1) によりグローバル変数 HBMP に取得されるビットマップ情報に基づき // ビュー座標 (x, y) に BMP 画像を描画 ww.DrawBmp(int x, int y); // ** (#2) ReadBmp(#2) により引数の hBmp に取得されるビットマップ情報に基づき // ビュー座標 (x, y) に BMP 画像を描画 ww.DrawBmp(int x, int y, HBITMAP& hBmp) // **** BMP イメージサイズの取得 **** // ** (#1) View2D クラスのグローバル変数 HBMP に取得されたビットマップ情報より // イメージサイズ imgsize を取得し返す CSize imgsize = ww.GetImageSize(void); // ** (#2) 引数のビットマップ情報 hBmp よりイメージサイズ imgsize を取得し返す CSize imgsize = ww.GetImageSize(HBITMAP& hBmp); // ** (#3) ファイルパス CString filepath の BMP イメージサイズ imgsize を取得し返す CSize imagesize = ww.GetImageSize(CString filepath); // ** (#4) ファイルパス char* filename の BMP イメージサイズ imgsize を取得し返す CSize imagesize = ww.GetImageSize(char* filename); // **** BMP フルカラー画像のチェック **** // ** (#1) 引数のビットマップ情報 hBmp より 24bit フルカラー画像をチェック ww.CheckBit(HBITMAP& hBmp); // **** HBMP の取得 **** // ** (#1) グローバル変数のビットマップ情報 HBMP を取得 HBITMAP hbmp = ww.GetHBMP(); // **** HBMP に取得 **** // ** (#1) 引数のビットマップ情報 hbmp をグローバル変数 HBMP に渡す ww.PutHBMP(HBITMAP& hbmp); // **** BMP ファイルの読み込み&表示 **** // ** (#1) filepath のファイルを読み込みビットマップ情報をグローバル変数 HBMP に一時的に取得 // してからビューに表示 ww.ReadDrawBmp(CString filepath, int x, int y); // ** (#2) filepath のファイルを読み込みビットマップ情報を引数の hBmpに取得してからビューに表示 ww.ReadDrawBmp(CString filepath, int x, int y, HBITMAP& hBmp); // **** BMP ファイルの読み込み&ロード **** // ** (#1) filepath のファイルを内部のバッファ buf に読み込み // 8bit のイメージデータを double 型一次元配列 rr, gg, bb へロード // 一次元配列 rr, gg, bb はこの関数内(View2D クラス)で動的に生成 ww.ReadLoadBmp(CString filepath); // **** BMP ファイルの読み込み **** // ** (#1) ドキュメントクラス C**Doc::Serialize(CArchive& ar) で選択された BMP ファイルから // ビットマップ情報を取得し View2D クラスのグローバル変数 HBMP に格納 // ビットマップ情報を格納するために DIBSECTION を生成(HBMP はそのハンドル) ww.Reading(CArchive& ar); // ** (#2) ドキュメントクラス C**Doc::Serialize(CArchive& ar) で選択された BMP ファイルから // ビットマップ情報を取得し引数 hbmp に渡す // ビットマップ情報を格納するために DIBSECTION を生成(hbmp はそのハンドル) ww.Reading(CArchive& ar, HBITMAP& hbmp); // **** BMP ファイルの書き込み **** // ** (#1) ドキュメントクラス C**Doc::Serialize(CArchive& ar) で指定されたファイル名で // Reading(#1) により View2D クラスのグローバル変数 HBMP に取得されるビットマップ情報から // イメージファイルを作成してファイルに書き込む ww.Writing(CArchive& ar); // ** (#2) ドキュメントクラス C**Doc::Serialize(CArchive& ar) で指定されたファイル名で // Reading(#2) により引数の hbmp に取得されるビットマップ情報から // イメージファイルを作成してファイルに書き込む ww.Writing(CArchive& ar, HBITMAP& hbmp); // ** (#1) ドキュメントクラス C**Doc::Serialize(CArchive& ar) で指定されたファイル名で // Reading(#1) により View2D クラスのグローバル変数 HBMP に取得されるビットマップ情報から // ファイルに書き込む // イメージファイルは作成せずに直接ファイルに書き込む ww.Writingx(CArchive& ar); // **** メッセージ表示 **** // ** (#1) ダイアログボックスに書式付きで数値データを表示 // double, int 型の数値を最大 10 までダイアログボックスに表示 (書式付き printf の近似関数) ww.Message(char* text, double a0, double a1, double a2, double a3, double a4, double a5, double a6, double a7, double a8, double a9); // ******** ウィンドウ 2D グラフィックス描画関数 ******** // **** ウィンドウ描画イメージを BMP ファイルへ書き込む **** // ** (#1) ビットマップオブジェクト(DIBSECTION)を介して、表示されているウィンドウの全領域を // イメージファイルを作成して filepath のファイルに書き込む ww.WriteWin(CString filepath); // ** (#2) ビットマップオブジェクト(DIBSECTION)を介して、ウィンドウ(m_hWnd)の長方形領域 // (x, y)−(x + width, y + height) よりビットマップ画像を切り出し、イメージファイルを作成 // して filepath のファイルに書き込む ww.WriteWin(HWND m_hWnd, CString filepath, int x, int y, int width, int height); // **** ウィンドウの背景色を設定 **** // ** (#1) ウィンドウの背景色を設定(default は白色) COLORREF WinColor = ww.SetWinColor(Color c); or ww.SetWinColor(Color c); // **** 描画する文字列の色を設定 **** // ** (#1) スクリーン座標に描画する文字列の色を設定 ww.StrColor(Color c); // **** 描画する文字列のフォントとサイズを設定 **** // ** (#1) スクリーン座標に描画する文字列のフォントとサイズを設定 CFont *oldfont = ww.StrFont(int size, CString font); // ** 描画する文字列のフォントとサイズを元に戻す // ** (#1) StrFont 関数で設定したフォントを元に戻す ww.ReturnFont(CFont *oldfont); // **** 文字列を描画 **** // ** (#1) スクリーン座標 (x, y) に CString 文字列を Color で描画 ww.PutString(int x, int y, CString str, Color c = BLACK); // ** (#2) スクリーン座標 (x, y) に char* 文字列を Color で描画 ww.PutString(int x, int y, char* text, Color c = BLACK); // **** 数値を表示 **** // ** (#1) スクリーン座標 (x, y) に書式付きで数値データを表示 // double, int 型の数値を最大 10 までウィンドウに表示(書式付き printf に近似させた関数) ww.Wprintf(int x, int y, char* text, double a0, double a1 = 0.0, double a2 = 0.0, double a3 = 0.0, double a4 = 0.0, double a5 = 0.0, double a6 = 0.0, double a7 = 0.0, double a8 = 0.0, double a9 = 0.0); // 文字色は StrColor で設定 // **** 描画用ペンを生成 **** // ** (#1) 描画用ペンの色 c と太さ(ドットサイズ) dot を設定 ww.SetPen(CPen& pen, Color c = BLACK, int dot = 1); // **** 描画用ペンを移動 **** // ** (#1) 描画用ペンをスクリーン座標 (x, y) に移動 ww.Move(int x, int y); // **** 線分を描画 **** // ** (#1) スクリーン座標で現在のペン位置と (x, y) を直線描画 ww.Line(int x, int y); // 描画色とドットサイズは ww.SetPen で設定 // ** (#2) スクリーン座標で現在のペン位置と (x, y) を色 c, ドットサイズ dot で実線描画 ww.Line(int x, int y, Color c, int dot = 1); // ** (#3) スクリーン座標 (x1, y1) と (x2, y2) を直線描画 ww.Line(int x1, int y1, int x2, int y2); // 描画色とドットサイズは ww.SetPen で設定 // ** (#4) スクリーン座標 (x1, y1) と (x2, y2) を色 c, ドットサイズ dot で実線描画 ww.Line(int x1, int y1, int x2, int y2, Color c, int dot = 1); // **** 四角形を描画 **** // ** (#1) スクリーン座標 (x1, y1)−(x2, y2)を対角頂点とする四角形を色 c,ドットサイズ dotで描画 ww.Square(int x1, int y1, int x2, int y2, Color c = BLACK, int dot = 1); // **** 円を描画 **** // ** (#1) スクリーン座標 (x, y) を中心に半径 r の円を色 c、ドットサイズ dot, n 分割で描画 ww.Circle(int x, int y, int r, Color c = BLACK, int dot = 1, int n = 20); // **** 点を描画 **** // ** (#1) スクリーン座標 (x, y) に色 c 、ドットサイズ dot で点を描画 ww.PutDot(int x, int y, Color c, int dot = 1); // **** 画素点を描画 **** // ** (#1) スクリーン座標 (x, y) に色 c で画素点を描画 ww.PutPixel(int x, int y, Color c = BLACK); // **** 描画(クライアント)領域のサイズを取得 **** // ** (#1) 描画領域(クライアント領域)のサイズを取得 CSize client = ww.GetClientSize(HWND m_hWnd); // ******** ウィンドウ描画関数 ******************************************************************** // **** ウィンドウの背景色を設定 **** // ** (#1) ウィンドウの背景色を設定(default は白色) COLORREF WinColor = SetWinColor(CDC* pdc, Color c = WHITE); or SetWinColor(CDC* pdc, Color c = WHITE); // **** 描画する文字列の色を設定 **** // ** (#1) スクリーン座標に描画する文字列の色を設定 StrColor(CDC* pdc, Color c); // **** 描画する文字列のフォントとサイズを設定 **** // ** (#1) スクリーン座標に描画する文字列のフォントとサイズを設定 CFont *oldfont = StrFont(CDC* pdc, int size, CString font); // ** 描画する文字列のフォントとサイズを元に戻す // ** (#1) StrFont 関数で設定したフォントを元に戻す ReturnFont(CDC* pdc, CFont *oldfont); // **** 文字列を描画 **** // ** (#1) スクリーン座標 (x, y) に CString 文字列を Color で描画 PutString(CDC* pdc, int x, int y, CString str, Color c = BLACK); // ** (#2) スクリーン座標 (x, y) に char* 文字列を Color で描画 PutString(CDC* pdc, int x, int y, char* text, Color c = BLACK); // **** 数値を表示 **** // ** (#1) スクリーン座標 (x, y) に書式付きで数値データを表示 // double, int 型の数値を最大 10 までウィンドウに表示(書式付き printf に近似させた関数) Wprintf(CDC* pdc, int x, int y, char* text, double a0, double a1 = 0.0, double a2 = 0.0, double a3 = 0.0, double a4 = 0.0, double a5 = 0.0, double a6 = 0.0, double a7 = 0.0, double a8 = 0.0, double a9 = 0.0); // 文字色は StrColor で設定 // **** 描画用ペンを生成 **** // ** (#1) 描画用ペンの色 c と太さ(ドットサイズ) dot を設定 SetPen(CDC* pdc, CPen& pen, Color c = BLACK, int dot = 1); // **** 描画用ペンを移動 **** // ** (#1) 描画用ペンをスクリーン座標 (x, y) に移動 Move(CDC* pdc, int x, int y); // **** 線分を描画 **** // ** (#1) スクリーン座標で現在のペン位置と (x, y) を直線描画 Line(CDC* pdc, int x, int y); // 描画色とドットサイズは SetPen で設定 // ** (#2) スクリーン座標で現在のペン位置と (x, y) を色 c, ドットサイズ dot で実線描画 Line(CDC* pdc, int x, int y, Color c, int dot = 1); // ** (#3) スクリーン座標 (x1, y1) と (x2, y2) を直線描画 Line(CDC* pdc, int x1, int y1, int x2, int y2); // 描画色とドットサイズは SetPen で設定 // ** (#4) スクリーン座標 (x1, y1) と (x2, y2) を色 c, ドットサイズ dot で実線描画 Line(CDC* pdc, int x1, int y1, int x2, int y2, Color c, int dot = 1); // **** 四角形を描画 **** // ** (#1) スクリーン座標 (x1, y1)−(x2, y2)を対角頂点とする四角形を色 c,ドットサイズ dotで描画 Square(CDC* pdc, int x1, int y1, int x2, int y2, Color c = BLACK, int dot = 1); // **** 円を描画 **** // ** (#1) スクリーン座標 (x, y) を中心に半径 r の円を色 c、ドットサイズ dot, n 分割で描画 Circle(CDC* pdc, int x, int y, int r, Color c = BLACK, int dot = 1, int n = 20); // **** 点を描画 **** // ** (#1) スクリーン座標 (x, y) に色 c 、ドットサイズ dot で点を描画 PutDot(CDC* pdc, int x, int y, Color c, int dot = 1); // **** 画素点を描画 **** // ** (#1) スクリーン座標 (x, y) に色 c で画素点を描画 PutPixel(CDC* pdc, int x, int y, Color c = BLACK); // **** イメージサイズの取得 **** // ** (#1) ファイルパス CString filepath の BMP 画像のイメージサイズ取得 CSize imgsize = GetImageSize(CString filepath); // ** (#2) ファイルパス char* filename の BMP 画像のイメージサイズ取得 CSize imagesize = GetImageSize(char* filename);