グラフィックデータ制御関数 | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル 画面左上を画像の左上頂点としtest1.bmpを透過色有効で表示します #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // BMP画像の表示 LoadGraphScreen( 0 , 0 , "test1.bmp" , TRUE ) ; WaitKey() ; // キーの入力待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル test1.bmpを読みこみ画面左上に描画します #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // BMP画像のメモリへの読みこみ GHandle = LoadGraph( "test1.bmp" ) ; // 画面左上に描画します(『DrawGraph』を使用) DrawGraph( 0 , 0 , GHandle , FALSE ) ; // キーの入力待ち(『WaitKey』を使用) WaitKey() ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル test2.bmpを一つのグラフィックのサイズ48×56横4、縦3、分割総数 10で分割読み込みし、int型の配列GHandleに格納します。 その後ロードしたグラフィックパターンを画面左上でアニメーション させます。(画面はちらつきます) #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle[ 10 ] ; int i ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // BMP画像のメモリへの分割読み込み LoadDivGraph( "test2.bmp" , 10 , 4 , 3 , 48 , 56 , GHandle ) ; // ロードしたグラフィックのアニメーション i = 0 ; // キーが押されるまでループ(キー判定には『CheckHitKeyAll』を使用) while( CheckHitKeyAll() == 0 ) { // グラフィックの描画(『DrawGraph』使用) DrawGraph( 0 , 0 , GHandle[ i ] , FALSE ) ; // アニメーションパターンナンバーを変更 i ++ ; if( i == 10 ) i = 0 ; // 一定時間待つ(『WaitTimer』使用) WaitTimer( 100 ) ; // メッセージ処理 if( ProcessMessage() == -1 ) { break ; // エラーが起きたらループから抜ける } } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル GetDrawScreenGraph のサンプルを参考にして下さい。 | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル 縦横20ピクセルの描画可能グラフィックハンドルを作成して、そこに「あ」の文字を描画した後、 作成した描画可能グラフィックハンドルを画面いっぱいに拡大して描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int handle; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 20x20サイズのアルファチャンネルなしの描画可能画像を作成する handle = MakeScreen( 20, 20, FALSE ) ; // 作成した画像を描画対象にする SetDrawScreen( handle ) ; // 画像に対して「あ」という文字を描画する DrawString( 0, 0, "あ", GetColor( 255, 255, 255 ) ) ; // 描画対象を表画面にする SetDrawScreen( DX_SCREEN_FRONT ) ; // 描画対象画像を画面いっぱいに拡大して描画する DrawExtendGraph( 0, 0, 640, 480, handle, FALSE ) ; // キー入力待ち WaitKey(); // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル 640x480 のアンチエイリアス効果のある描画可能なグラフィックを作成して、 そのグラフィックに DxChara.x を描画した後、裏画面に描画可能なグラフィックを描画します。 SetFullSceneAntiAliasingMode で画面自体の設定を変更してアンチエイリアス効果を得るという処理を、 MakeScreen と SetDrawValidMultiSample を使った場合はこうなります、というサンプルです。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; int Screen ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 描画可能なグラフィックのアンチエイリアス設定を行う SetDrawValidMultiSample( 4, 2 ) ; // 描画可能なグラフィックの作成 Screen = MakeScreen( 640, 480, FALSE ) ; // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 描画先を描画可能がグラフィックに設定 SetDrawScreen( Screen ) ; // 画面を初期化 ClearDrawScreen() ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 描画可能なグラフィックを描画 DrawGraph( 0, 0, Screen, FALSE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; // キーの入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル ありません | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル ありません | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル ありません | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル 『乗算済みアルファのすすめ』のサンプルプログラムをご覧ください。 | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル test1.bmpをメモリに読み込み、画面左上に透過色有効で描画する #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // test1.bmpの読み込み GHandle = LoadGraph( "test1.bmp" ) ; // 読みこんだグラフィックを画面左上に描画 DrawGraph( 0 , 0 , GHandle , TRUE ) ; WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル test1.bmpをメモリに読み込み、座標( 100 , 0 )に透過色無効で反転描画する #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // test1.bmpの読み込み GHandle = LoadGraph( "test1.bmp" ) ; // 読みこんだグラフィックを反転描画 DrawTurnGraph( 100 , 0 , GHandle , FALSE ) ; WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル test1.bmp(サイズ130×480)をメモリに読み込み、座標( 100 , 0 )に 横幅2倍のサイズで透過色有効で描画する #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // test1.bmpの読み込み GHandle = LoadGraph( "test1.bmp" ) ; // 読みこんだグラフィックを拡大描画 DrawExtendGraph( 100 , 0 , 100 + 130 * 2 , 0 + 480 , GHandle , TRUE ) ; WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル 画面中心に test1.bmp を1.5倍に拡大し90度回転させて描画します #include "DxLib.h" #define PI 3.1415926535897932384626433832795f int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // test1.bmpの読み込み GHandle = LoadGraph( "test1.bmp" ) ; // 読みこんだグラフィックを回転描画 DrawRotaGraph( 320 , 240 , 1.5f , PI / 2 , GHandle , TRUE ) ; WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル 画面中心に test1.bmp を1.5倍に拡大し画像の左上端を基点に90度回転させて描画します #include "DxLib.h" #define PI 3.1415926535897932384626433832795f int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // test1.bmpの読み込み GHandle = LoadGraph( "test1.bmp" ) ; // 読みこんだグラフィックを回転描画 DrawRotaGraph2( 320, 240, 0, 0, 1.5f, PI / 2, GHandle, TRUE ) ; WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル 画面中心に test1.bmp を横に2倍、縦に1.5倍に拡大し画像の左上端を基点に90度回転させて描画します #include "DxLib.h" #define PI 3.1415926535897932384626433832795f int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // test1.bmpの読み込み GHandle = LoadGraph( "test1.bmp" ) ; // 読みこんだグラフィックを回転描画 DrawRotaGraph3( 320, 240, 0, 0, 2.0f, 1.5f, PI / 2, GHandle, TRUE ) ; WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル test1.bmp(サイズ130×480)をメモリに読み込み、( 0 , 0 )( 145 , 62 ) ( 12 , 56 )( 168 , 121 )をそれぞれ描画する画像の左上、右上、右下、 左下として透過色有効で描画する #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // test1.bmpの読み込み GHandle = LoadGraph( "test1.bmp" ) ; // 読みこんだグラフィックを自由変形描画 DrawModiGraph( 0 , 0 , 145 , 62 , 168 , 121 , 12 , 56 , GHandle , TRUE ) ; WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル グラフィック testDiv.bmp を読み込み、グラフィック中の (32,32)-(64,64) の部分 だけを画面座標 (100,100) に描画する #include "DxLib.h" // WinMain 関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Graph ; // DXライブラリの初期化 if( DxLib_Init() == -1 ) return -1 ; // グラフィックのロード Graph = LoadGraph( "testDiv.bmp" ) ; // グラフィック中の(32,32)-(64,64)の部分を画面座標(100,100)に // 透過色処理あり、反転処理なしで描画 DrawRectGraph( 100, 100, 32, 32, 32, 32, Graph, TRUE, FALSE ) ; // キーの入力待ち WaitKey() ; // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル testDiv.bmp をロードし、作成したグラフィックから、(0,32)-(32,64) の部分を抜き出し新たなグラフィックハンドルを作成します。 #include "DxLib.h" // WinMain 関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Graph, Graph2 ; // DXライブラリの初期化 if( DxLib_Init() == -1 ) return -1 ; // グラフィックのロード Graph = LoadGraph( "testDiv.bmp" ) ; // Graph 中の (0,32)-(32,64) の部分を抜き出し、新たな // グラフィックハンドルを作成 Graph2 = DerivationGraph( 0, 32, 32, 32, Graph ) ; // 新たに作成したグラフィックハンドルで描画 DrawGraph( 100, 100, Graph2, TRUE ) ; // キーの入力待ち WaitKey() ; // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル 画面にでたらめに1000個の点を描き、その画面を取りこむ #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; int i ; int Cr ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 白色の値を取得 Cr = GetColor( 255 , 255 , 255 ) ; // 1000個の点を描く for( i = 0 ; i < 1000 ; i ++ ) { // ランダムな位置に点を描く(『GetRand』を使用) DrawPixel( GetRand( 639 ) , GetRand( 479 ) , Cr ) ; } // 画面のサイズと同じサイズのグラフィックを作成 GHandle = MakeGraph( 640 , 480 ) ; // 画面データの取りこみ GetDrawScreenGraph( 0 , 0 , 640 , 480 , GHandle ) ; WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル test1.bmpをメモリに読み込み、そのサイズを取得する、上記の例を 無意味にもソフトプログラム化したものです。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; int GSizeX , GSizeY ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // test1.bmpの読み込み GHandle = LoadGraph( "test1.bmp" ) ; // 読みこんだグラフィックのサイズを得る GetGraphSize( GHandle , &GSizeX , &GSizeY ) ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル BMPをロードして表示したり作成したりした後これらのグラフィックを 削除する。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle , GHandle2 ; int i ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // test1.bmpの読み込み GHandle = LoadGraph( "test1.bmp" ) ; // 適当な座標に10回描画 for( i = 0 ; i < 10 ; i ++ ) { // 画像をランダムな座標に描画する(『GetRand』使用) DrawGraph( GetRand( 639 ), GetRand( 479 ), GHandle, TRUE ) ; } // 空のグラフィックを作成 GHandle2 = MakeGraph( 128 , 128 ) ; // 適当な領域を取りこむ GetDrawScreenGraph( 156 , 24 , 156 + 128 , 24 + 128 , GHandle2 ) ; // 取り込んだ画像で10回描画 for( i = 0 ; i < 10 ; i ++ ) { // 画像をランダムな座標に描画する(『GetRand』使用) DrawGraph( GetRand( 639 ), GetRand( 479 ), GHandle2, TRUE ) ; } // 全グラフィックを初期化 InitGraph() ; WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル test1.bmpをメモリに読み込み、画面左上に透過色有効で描画した後 メモリ上から削除する #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // test1.bmpの読み込み GHandle = LoadGraph( "test1.bmp" ) ; // 読みこんだグラフィックを画面左上に描画 DrawGraph( 0 , 0 , GHandle , TRUE ) ; // 描画が終ったのでグラフィックをメモリ上から削除する DeleteGraph( GHandle ) ; WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル test1.bmp(サイズ130×480)を読み込みネアレストネイバー法と バイリニア法で描画する #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // test1.bmpの読み込み GHandle = LoadGraph( "test1.bmp" ) ; // 描画モードをネアレストネイバー法にする SetDrawMode( DX_DRAWMODE_NEAREST ) ; // 読みこんだグラフィックを画面左上に拡大描画 DrawExtendGraph( 0 , 0 , 130 * 2 , 480 * 2 , GHandle , FALSE ) ; // 描画モードをバイリニア法にする SetDrawMode( DX_DRAWMODE_BILINEAR ) ; // 読みこんだグラフィックを先ほどの隣に描画 DrawExtendGraph( 260 , 0 , 260 + 130 * 2 , 480 * 2 , GHandle , FALSE ) ; WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル back.bmpとtest1.bmpを読み込みそれぞれノーブレンドと アルファブレンドと加算ブレンドと減算ブレンドと乗算ブレンドで描画する #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int TestHandle , BackHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // test1.bmpの読み込み TestHandle = LoadGraph( "test1.bmp" ) ; // back.bmpの読み込み BackHandle = LoadGraph( "back.bmp" ) ; // 描画ブレンドモードをノーブレンドにする SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ; // 背景を描画 DrawGraph( 0 , 0 , BackHandle , FALSE ) ; // 上に載せるグラフィックを描画 DrawGraph( 255 , 0 , TestHandle , TRUE ) ; // キー待ち(『WaitKey』を使用) WaitKey() ; // 背景を描画 DrawGraph( 0 , 0 , BackHandle , FALSE ) ; // 描画ブレンドモードをアルファブレンド(50%)にする SetDrawBlendMode( DX_BLENDMODE_ALPHA , 128 ) ; // 上に載せるグラフィックを描画 DrawGraph( 255 , 0 , TestHandle , TRUE ) ; // キー待ち(『WaitKey』を使用) WaitKey() ; // 描画ブレンドモードをノーブレンドにする SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ; // 背景を描画 DrawGraph( 0 , 0 , BackHandle , FALSE ) ; // 描画ブレンドモードを加算ブレンド(100%)にする SetDrawBlendMode( DX_BLENDMODE_ADD , 255 ) ; // 上に載せるグラフィックを描画 DrawGraph( 255 , 0 , TestHandle , TRUE ) ; // キー待ち(『WaitKey』を使用) WaitKey() ; // 描画ブレンドモードをノーブレンドにする SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ; // 背景を描画 DrawGraph( 0 , 0 , BackHandle , FALSE ) ; // 描画ブレンドモードを減算ブレンド(80%)にする SetDrawBlendMode( DX_BLENDMODE_SUB , 204 ) ; // 上に載せるグラフィックを描画 DrawGraph( 255 , 0 , TestHandle , TRUE ) ; // キー待ち((7-3)『WaitKey』を使用) WaitKey() ; // 描画ブレンドモードをノーブレンドにする SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ; // 背景を描画 DrawGraph( 0 , 0 , BackHandle , FALSE ) ; // 描画ブレンドモードを乗算ブレンドにする SetDrawBlendMode( DX_BLENDMODE_MUL , 0 ) ; // 上に載せるグラフィックを描画 DrawGraph( 255 , 0 , TestHandle , TRUE ) ; // キー待ち((7-3)『WaitKey』を使用) WaitKey() ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル test1.bmpを読み込み赤の色要素のみで描画します #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // test1.bmpの読み込み GHandle = LoadGraph( "test1.bmp" ) ; // 描画輝度を赤のみにセット SetDrawBright( 255 , 0 , 0 ) ; // グラフィックの描画 DrawGraph( 0 , 0 , GHandle , FALSE ) ; // キー待ち(『WaitKey』を使用) WaitKey() ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル R:255 G:0 B:255 の色を透過色にしてtest4.bmpを画面に描画する #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 透過色を変更 SetTransColor( 255 , 0 , 255 ) ; // BMP画像のメモリへの読みこみ GHandle = LoadGraph( "test4.bmp" ) ; // 画面左上に描画します((3-7)『DrawGraph』を使用) DrawGraph( 0 , 0 , GHandle , TRUE ) ; // キーの入力待ち((6-3)『WaitKey』を使用) WaitKey() ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル Scene1.jpg から Scene2.jpg への画面の切り替えを、ブレンド画像機能を使って行う(ブレンド画像に BlendGraph.bmp を使用) #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int BlendGraph, GrHandle1, GrHandle2 ; int i ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1 ; // 裏画面を使用 SetDrawScreen( DX_SCREEN_BACK ) ; // ブレンド画像を読み込む BlendGraph = LoadBlendGraph( "BlendGraph.bmp" ) ; // 二つの画像の読み込み GrHandle1 = LoadGraph( "Scene1.jpg" ) ; GrHandle2 = LoadGraph( "Scene2.jpg" ) ; // 256 フレーム掛けて切り替え for( i = 0 ; i < 256 ; i ++ ) { // メッセージ処理 if( ProcessMessage() != 0 ) break ; // Scene2.jpg を描画 DrawGraph( 0, 0, GrHandle2, FALSE ) ; // Scene1.jpg と BlendGraph.bmp を合成して描画 // (境界幅は 64) DrawBlendGraph( 0, 0, GrHandle1, FALSE, BlendGraph, i, 64 ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル LoadBlendGraph関数 のサンプルを参照してください。 | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
<<各フィルターの説明>> DX_GRAPH_FILTER_MONO:モノトーンフィルタ 引数 int Cb : 青色差( -255 〜 255 ) int Cr : 赤色差( -255 〜 255 ) 解説 画像をモノトーン調に変化させることができるフィルターです。 各ピクセルの色をRGB形式からYCbCr形式に変換して、その上ですべてのピクセルの輝度以外の成分を 引数の Cb Cr の値を置き換えた後、再びRGB形式に戻します。 値の調整が難しいですが、似たような効果を得ることができる DX_GRAPH_FILTER_HSB より負荷は低いです。 サンプル 画像 Src1.bmp をモノトーンフィルタを使用してセピア調の画像に変換してから画面に描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Handle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む Handle = LoadGraph( "Src1.bmp" ) ; // モノトーンフィルターでセピア調の画像に変換 GraphFilter( Handle, DX_GRAPH_FILTER_MONO, -60, 7 ) ; // 画像を画面に描画 DrawGraph( 0, 0, Handle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }元画像 変換後 DX_GRAPH_FILTER_GAUSS:ガウスフィルタ 引数 int PixelWidth : 使用ピクセル幅( 8 , 16 , 32 の何れか ) int Param : ぼかしパラメータ( 100 で約1ピクセル分の幅 ) 解説 画像にガウス関数を使用したぼかし効果を与えることができるフィルターです。 Param の値の大きさでぼかしの強さが変化しますが、ぼかせる度合いには限界があります。 ぼかしの限界は PixelWidth の値の大きさで決まり、PixelWidth の値が大きいほどぼかしの強さの限界が大きくなり、 それとともに処理負荷も大きくなります。 このフィルタは非常に負荷が大きいので、強いぼかしをかけたい場合は PixelWidth の値を 32 にして強いぼかしを 掛けるより、縮小フィルタ( DX_GRAPH_FILTER_DOWN_SCALE )で画像を縮小した後弱いぼかしを掛け、 その後 DrawExtendGraph で元の大きさで描画する、という方法を採ったほうが処理負荷を小さく抑えることができます。 <<注意>> サイズが 2 の n乗のドット数( 1,2,4,8,16,32,64,128,256,512,1024 )ぴったりではない画像に対してガウスフィルタを掛けると、 画像の端に、画像には無い色が滲み出たりすることがあります。 こちらは今のところ仕様となりますので、この現象を回避する場合はガウスフィルタを掛ける画像は2のn乗サイズにするか、 若しくは画像のサイズを少し必要なサイズより大きめにして滲んだ部分を使わないという方法で対処してください。 サンプル 画像 Src1.bmp をガウスフィルタを使用してぼかした画像に変換してから画面に描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Handle ; // 画面モードを32bitカラーにする SetGraphMode( 640, 480, 32 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む Handle = LoadGraph( "Src1.bmp" ) ; // ガウスフィルターを施す GraphFilter( Handle, DX_GRAPH_FILTER_GAUSS, 16, 1400 ) ; // 画像を画面に描画 DrawGraph( 0, 0, Handle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }元画像 変換後 DX_GRAPH_FILTER_DOWN_SCALE:縮小フィルタ 引数 int DivNum : 元のサイズの何分の1か、という値( 2 , 4 , 8 の何れか ) 解説 画像を綺麗に縮小するためのフィルターです。 DrawExtendGraph でも縮小描画することができますが、それよりも綺麗に縮小した画像を得ることができます。 主にガウスフィルタ( DX_GRAPH_FILTER_GAUSS )の処理負荷を下げる目的で使用されることを想定しています。 サンプル 画像 Src1.bmp を4分の1のサイズに縮小してから画面に描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Handle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む Handle = LoadGraph( "Src1.bmp" ) ; // ガウスフィルターを施す GraphFilter( Handle, DX_GRAPH_FILTER_DOWN_SCALE, 4 ) ; // 画像を画面に描画 DrawGraph( 0, 0, Handle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }元画像 変換後( 左 )と DrawExtendGraph の縮小結果( 右 ) DX_GRAPH_FILTER_BRIGHT_CLIP:明るさクリップフィルタ 引数 int CmpType : クリップタイプ DX_CMP_LESS CmpParamより小さい場合クリップ DX_CMP_GREATER CmpParamより大きい場合クリップ int CmpParam : クリップパラメータ( 0 〜 255 ) int ClipFillFlag : クリップしたピクセルを塗りつぶすかどうか ( TRUE:塗りつぶす FALSE:塗りつぶさない ) int ClipFillColor : クリップしたピクセルに塗る色値( GetColor で取得できる値 ) ( ClipFillFlag が FALSE の場合は使用されません ) int ClipFillAlpha : クリップしたピクセルに塗るアルファ値( 0 〜 255 ) ( ClipFillFlag が FALSE の場合は使用されません ) 解説 画像の各ピクセルを輝度に応じて引数で渡す色で塗りつぶすフィルターです。 まず各ピクセルの色から輝度を算出して、その値が CmpType が DX_CMP_LESS の場合は CmpParam より小さかったら、CmpType が DX_CMP_GRATER の場合は CmpParam より大きかったら クリップ処理が行われます。 クリップ処理は ClipFillFlag が TRUE かどうかで処理が別れます。 FALSE の場合は単純に出力先の画像にそのピクセルが書き込まれません。ただ、GraphFilter 関数は 入力元と出力先が同じなので、何も変化しないことになります。なので、ClipFillFlag を FALSE にする 意味があるのは入力元と出力先を別にできる関数 GraphFilterBlt や GraphFilterRectBlt を 使用した場合のみとなります。 ClipFillFlag が TRUE の場合は、クリップ処理としてクリップ判定されたピクセルに元画像の ピクセルの色の代わりに ClipFillColor で指定した色が、出力先画像にアルファチャンネルが ある場合は元画像のピクセルのアルファ値の代わりに ClipFillAlpha が出力先に書き込まれます。 サンプル 画像 Src1.bmp の輝度50%以下の部分を緑色にしてから画面に描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Handle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む Handle = LoadGraph( "Src1.bmp" ) ; // 明るさクリップフィルターを施す GraphFilter( Handle, DX_GRAPH_FILTER_BRIGHT_CLIP, DX_CMP_LESS, 128, TRUE, GetColor( 0, 255, 0 ), 255 ) ; // 画像を画面に描画 DrawGraph( 0, 0, Handle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }元画像 変換後 DX_GRAPH_FILTER_HSB:色相・彩度・明度フィルタ 引数 int HueType : Hue の意味( 0:相対値 1:絶対値 ) int Hue : 色相 ( HueType が 0 の場合はピクセルの色相に対する相対値( -180 〜 180 ) HueType が 1 の場合は色相の絶対値( 0 〜 360 ) ) int Saturation : 彩度( -255 〜 ) int Bright : 輝度( -255 〜 255 ) 解説 画像の各ピクセルのRGBの値から色相・彩度・輝度の値を算出して、それに対して引数の Hue、Saturation、Bright を加えることで画像の色相や彩度、輝度を補正するフィルターです。 まず HueType を 0 にするか 1 にするかで結果が大きく変化します。 0 にした場合は元の色相の値に対して Hue の値を加算するのに対して、1 にした場合は元の色相の値を 無視して Hue の値に置き換えるのですべてのピクセルが同じ色相となり、結果としてモノトーン調の 出力結果になります。 Hue の値は色相です、色相は青、赤、緑の色合い 0 〜 360 の数値で表したもので、0 は赤、 120が緑、240が青、360が再び赤、というようになっています。この値に変化を加えることで 色合いを変えることができます。HueType が 0 か 1 かによって指定できる値の範囲と意味が変化して、 HueType が 0 の場合は元の色相に対する相対値となるので指定できる値は -180 から 180 になります。 HueType が 1 の場合は、元の色相を無視した絶対値となるので指定できる値は 0 から 360 となります。 Saturation は彩度です、彩度は高ければ高いほど鮮やかな色に近づき、低ければ低いほどグレーに近くなります。 Saturation は必ず元の彩度に対する相対値の指定になりますので、特に彩度を変更したくない場合は 0 を指定します。 Bright は輝度です、この値を 0 以下にすると出力結果が黒に近くなり、0 以上にすると出力結果が 白に近くなります。0 を指定すれば元画像と同じ輝度で出力されます。 サンプル 画像 Src1.bmp の水面の色を紫色に変化させ、彩度を上げて輝度を下げてから画面に描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Handle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む Handle = LoadGraph( "Src1.bmp" ) ; // 色相・彩度・輝度フィルターを施す GraphFilter( Handle, DX_GRAPH_FILTER_HSB, 0, 100, 90, -60 ) ; // 画像を画面に描画 DrawGraph( 0, 0, Handle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }元画像 変換後 色相を固定した場合としない場合の違い 固定した場合 固定しない場合 ( 固定した場合はすべてのピクセルの色相が同じになり、固定しない場合は各ピクセル色相が独立します ) DX_GRAPH_FILTER_INVERT:階調の反転フィルタ 引数 なし 解説 画像の各ピクセルのRGBの値を反転するフィルタです。 サンプル 画像 Src1.bmp の色を反転してから画面に描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Handle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む Handle = LoadGraph( "Src1.bmp" ) ; // 階調反転フィルターを施す GraphFilter( Handle, DX_GRAPH_FILTER_INVERT ) ; // 画像を画面に描画 DrawGraph( 0, 0, Handle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }元画像 変換後 DX_GRAPH_FILTER_LEVEL:レベル補正フィルタ 引数 int Min : 変換元の下限値( 0 〜 255 ) int Max : 変換元の上限値( 0 〜 255 ) int Gamma : ガンマ値( 100 で 1.0 を表し、ガンマ補正無し、1 より小さい値は不可 ) int AfterMin : 変換後の最低値( 0 〜 255 ) int AfterMax : 変換後の最大値( 0 〜 255 ) 解説 画像にレベル補正を行うフィルタです、輝度分布が偏っていて締まりの無い画像のコントラストを上げたりできます。 Min の値を 0 以上にすると全体的に画像が暗い方向に傾き、白っぽくなってしまっている画像を引き締めます。 Max の値を 255 以下にすると全体的に画像が明るい方向に傾き、暗くなってしまっている画像を明るくします。 Gamma の値を 100 以上にすると画像が明るくなります。( Max の値を下げるのとは違う変化です ) Gamma の値を 100 以下にすると画像が暗くなります。( Min の値を上げるのとは違う変化です ) AfterMin の値を 0 以上にすると、画像が全体的に白っぽくなります。 AfterMax の値を 255 以下にすると、画像が全体的に黒に近くなります。 サンプル 画像 Src1.bmp をレベル補正フィルタを使用してコントラストと鮮やかさを上げてから画面に描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Handle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む Handle = LoadGraph( "Src1.bmp" ) ; // レベル補正フィルターを施す GraphFilter( Handle, DX_GRAPH_FILTER_LEVEL, 60, 210, 120, 0, 255 ) ; // 画像を画面に描画 DrawGraph( 0, 0, Handle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }元画像 変換後 DX_GRAPH_FILTER_TWO_COLOR:2階調化フィルタ 引数 int Threshold : 閾値( 0 〜 255 ) int LowColor : 閾値より値が低かったピクセルの変換後の色値( GetColor で取得できる値 ) int LowAlpha : 閾値より値が低かったピクセルの変換後のアルファ値( 0 〜 255 ) int HighColor : 閾値より値が高かったピクセルの変換後の色値( GetColor で取得する ) int HighAlpha : 閾値より値が高かったピクセルの変換後のアルファ値( 0 〜 255 ) 解説 画像を2階調化するフィルターです。 画像の各ピクセルの色から 0 〜 255 の輝度値を算出し、その値が Threshold で指定した値以上かどうかで 変換後の色が LowColor, LowAlpha になるか、 HighColor, HighAlpha になるかが決まります。 引数の説明以上に引数について解説できることはアルファチャンネルを持たない画像に対しては LowAlpha と HighAlpha の引数は特に使われないということくらいです。 サンプル 画像 Src1.bmp を2階調化フィルタで輝度が50%以下の部分を暗い青に、 50%以上の部分を黄色にしてから画面に描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Handle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む Handle = LoadGraph( "Src1.bmp" ) ; // 2階調化フィルターを施す GraphFilter( Handle, DX_GRAPH_FILTER_TWO_COLOR, 128, GetColor( 0, 0, 128 ), 255, GetColor( 255, 255, 0 ), 255 ) ; // 画像を画面に描画 DrawGraph( 0, 0, Handle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }元画像 変換後 DX_GRAPH_FILTER_GRADIENT_MAP:グラデーションマップフィルタ 引数 int MapGrHandle : グラデーションマップとして使用するグラフィックハンドル、普通に LoadGraph などで作成したハンドル ( 横幅は 256pixelである必要があります、縦幅は何でも( 1pixel でも 100pixel でも )大丈夫です ) int Reverse : グラデーションマップを左右反転して使用するかどうか ( TRUE : 左右反転して使用する FALSE : 左右反転しない ) 解説 画像の各ピクセルの輝度からグラデーションマップのX座標を算出して、その座標の色に変換するフィルターです。 輝度が0の場合はグラデーションマップの一番左上のピクセルの色が( x:0 y:0 座標のピクセル )、 輝度が255( 最大 )だったらグラデーションマップの一番右上のピクセルの色が( x:255 y:0 座標のピクセル ) 出力結果の色となります。 変換元画像のピクセルの輝度によってグラデーションマップ中のX座標を決定しますが、Y座標は常に0ですので、 グラデーションマップ画像は縦幅1ピクセルでも問題ありません。 Reverse を TRUE にすると輝度からグラデーションマップのX座標を算出する結果を反転します。 つまり輝度が最大のときにグラデーションマップ中の一番左上のピクセルが使用され、輝度が最低のときに一番右上の ピクセルが使用されるようになります。 サンプル 画像 Src1.bmp を GMap.bmp をグラデーションマップとして使用してグラデーションマップフィルタを適用した後、 画面に描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Handle ; int GradHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む Handle = LoadGraph( "Src1.bmp" ) ; // グラデーションマップにする画像を読み込む GradHandle = LoadGraph( "GMap.bmp" ) ; // グラデーションマップフィルターを施す GraphFilter( Handle, DX_GRAPH_FILTER_GRADIENT_MAP, GradHandle, FALSE ) ; // 画像を画面に描画 DrawGraph( 0, 0, Handle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }元画像 変換後 グラデーションマップとして使用した画像 元画像の暗いところほど白く、元画像の明るいところほど青色になります。 | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル 画像 Src1.bmp をモノトーンフィルタを使用してセピア調の画像に変換してから画面に描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int SrcHandle ; int DestHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む SrcHandle = LoadGraph( "Src1.bmp" ) ; // 出力先に使用するグラフィックハンドルを作成 DestHandle = MakeScreen( 256, 256, FALSE ) ; // モノトーンフィルターでセピア調の画像に変換 GraphFilterBlt( SrcHandle, DestHandle, DX_GRAPH_FILTER_MONO, -60, 7 ) ; // 画像を画面に描画 DrawGraph( 0, 0, DestHandle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }元画像 変換後 | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル 画像 Src1.bmp の右下部分だけをモノトーンフィルタを使用してセピア調の画像に変換してから画面に描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int SrcHandle ; int DestHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む SrcHandle = LoadGraph( "Src1.bmp" ) ; // 出力先に使用するグラフィックハンドルを作成 // ( 右下部分だけで良いので縦横サイズは半分 ) DestHandle = MakeScreen( 128, 128, FALSE ) ; // 画像の右下部分だけをモノトーンフィルターでセピア調の画像に変換 GraphFilterRectBlt( SrcHandle, DestHandle, 128, 128, 256, 256, 0, 0, DX_GRAPH_FILTER_MONO, -60, 7 ) ; // 画像を画面に描画 DrawGraph( 0, 0, DestHandle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
<<各ブレンド効果説明>> DX_GRAPH_BLEND_RGBA_SELECT_MIX:RGBAの要素を選択して合成 引数 int SelectR : 出力の赤値となる要素 DX_RGBA_SELECT_SRC_R : GrHandle 画像の赤値 DX_RGBA_SELECT_SRC_G : GrHandle 画像の緑値 DX_RGBA_SELECT_SRC_B : GrHandle 画像の青値 DX_RGBA_SELECT_SRC_A : GrHandle 画像のアルファ値 DX_RGBA_SELECT_BLEND_R : BlendGrHandle 画像の赤値 DX_RGBA_SELECT_BLEND_G : BlendGrHandle 画像の緑値 DX_RGBA_SELECT_BLEND_B : BlendGrHandle 画像の青値 DX_RGBA_SELECT_BLEND_A : BlendGrHandle 画像のアルファ値 int SelectG : 出力の緑値となる要素( 渡せる値の種類は SelectR と同じです ) int SelectB : 出力の青値となる要素( 渡せる値の種類は SelectR と同じです ) int SelectA : 出力のアルファ値となる要素( 渡せる値の種類は SelectR と同じです ) 解説 合成後の画像として赤・緑・青・アルファの各成分を GrHandle の画像、BlendGrHandle の画像のどちらのどの要素から 取ってくるかを指定します。 例えば、SelectR に DX_RGBA_SELECT_BLEND_G を指定した場合は、合成後の画像の赤成分は、BlendGrHandle の緑成分になります。 <<注意>> 尚、このブレンド効果だけは BlendRatio の値が無視され、必ず BlendRatio 255 が指定されたのと同じ 結果になります。 また、GrHandle にアルファチャンネルが含まれていない場合は SelectA の値は無視されます。 ( GrHandle にアルファチャンネルが無いということはアルファ値を格納する領域が無いということなので ) このブレンド効果の主な利用法としてはマスク機能を想定しています。 赤・緑・青のどの成分も合成後の画像のアルファ値とすることができるので、普通の画像や描画結果をマスク画像として 使用することができ、マスク部分の半透明描画も可能なので、既存の DrawMask や DrawFillMask などのマスク関数より 柔軟なマスク機能を実現することができます。 ( ただ、シェーダーモデル2.0が使用できない環境では処理負荷が高くリアルタイム処理には利用できませんが・・・ ) サンプル 画像 Src1.bmp と Src2.tga を合成してから画面に描画します。 Src1.bmp にはアルファチャンネルが無いのでアルファチャンネル付きの描画可能画像のグラフィックハンドルを作成して、 そこに Src1.bmp を描画してから合成しています、合成後の画像は、赤を Src1.bmp の緑成分から、緑を Src1.bmp の 赤成分から、青を Src1.bmp の青成分から( つまり変化なし )、アルファ成分を Src2.tga の赤成分から取ってきています。 ( Src2.tga の緑成分・青成分・アルファ成分はこのサンプルでは使用していません ) #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Handle ; int BlendHandle ; int AlphaHandle ; // 画面モードを32bitカラーにする SetGraphMode( 640, 480, 32 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む Handle = LoadGraph( "Src1.bmp" ) ; // ブレンドする画像を読み込む BlendHandle = LoadGraph( "Src2.tga" ) ; // アルファチャンネル付きの描画可能画像のグラフィックハンドルを作成する AlphaHandle = MakeScreen( 256, 256, TRUE ) ; // 描画先を作成したアルファチャンネル付きの描画可能画像にする SetDrawScreen( AlphaHandle ) ; // 読み込んだ画像を描画する DrawGraph( 0, 0, Handle, FALSE ) ; // 描画先を表画面に戻す SetDrawScreen( DX_SCREEN_FRONT ) ; // 描画可能画像とブレンドする画像を合成する GraphBlend( AlphaHandle, BlendHandle, 255, DX_GRAPH_BLEND_RGBA_SELECT_MIX, DX_RGBA_SELECT_SRC_G, // 出力結果の赤成分は AlphaHandle の緑成分 DX_RGBA_SELECT_SRC_R, // 出力結果の緑成分は AlphaHandle の赤成分 DX_RGBA_SELECT_SRC_B, // 出力結果の青成分は AlphaHandle の青成分 DX_RGBA_SELECT_BLEND_R // 出力結果のアルファ成分は BlendHandle の赤成分 ) ; // アルファ成分で半透明になることを確かめるために画面全体にグレーの矩形を描画する DrawBox( 0, 0, 640, 480, GetColor( 128, 128, 128 ), TRUE ) ; // 描画可能画像を画面に描画 DrawGraph( 0, 0, AlphaHandle, TRUE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }元画像 ブレンド画像( 格子の部分は透明を表しています ) 合成結果 DX_GRAPH_BLEND_NORMAL : 通常 DX_GRAPH_BLEND_MULTIPLE : 乗算 DX_GRAPH_BLEND_DIFFERENCE : 減算 DX_GRAPH_BLEND_ADD : 加算 DX_GRAPH_BLEND_SCREEN : スクリーン DX_GRAPH_BLEND_OVERLAY : オーバーレイ DX_GRAPH_BLEND_DODGE : 覆い焼き DX_GRAPH_BLEND_BURN : 焼き込み DX_GRAPH_BLEND_DARKEN : 比較(暗) DX_GRAPH_BLEND_LIGHTEN : 比較(明) DX_GRAPH_BLEND_SOFTLIGHT : ソフトライト DX_GRAPH_BLEND_HARDLIGHT : ハードライト DX_GRAPH_BLEND_EXCLUSION : 除外 引数 なし 解説 上記の合成タイプは引数が無いので解説を一括します。 ( サンプルプログラムはこの解説の一番下にあります ) 解説で使用する画像は GrHandle がこの画像 BlendGrHandle がこの画像となります。( 格子の部分は透明な部分です ) 各タイプの説明の合成結果画像は BlendRatio に 255 を指定した場合の結果です。 <各タイプの説明にある擬似プログラムについて> ・色の値を 0.0 〜 1.0 としたプログラムです。 ・計算結果は 0.0 〜 1.0 にクランプされます。 ・赤・緑・青成分個々に対して同じ処理が実行されます。 ・擬似プログラムの後に共通して以下の処理が行われています 最終結果の色 = GrHandleの色 * ( 1.0 - BlendGrHandleのアルファ値 * BlendRatio ) + 結果の色 * ( BlendGrHandleのアルファ値 * BlendRatio ); ( BlendRatio は 0.0 〜 1.0 となります ) DX_GRAPH_BLEND_NORMAL : 通常 合成に特に特殊効果はありません、BlendRatio が 255 に近いほど BlendGrHandle の画像の不透明度が高くなります。 <<結果算出の擬似プログラム>> 結果の色 = BlendGrHandleの色; DX_GRAPH_BLEND_MULTIPLE : 乗算 二つの画像の色を乗算します、乗算といっても各成分を 0.0 〜 1.0 の値に見立てて乗算を行うので、 元の色より暗くなることはあっても明るくなることはありません。 <<結果算出の擬似プログラム>> 結果の色 = GrHandleの色 * BlendGrHandleの色; DX_GRAPH_BLEND_DIFFERENCE : 減算 GrHandle の色から BlendGrHandle の色を引きます。 <<結果算出の擬似プログラム>> 結果の色 = GrHandleの色 - BlendGrHandleの色; DX_GRAPH_BLEND_ADD : 加算 GrHandle の色に BlendGrHandle の色を足します。 <<結果算出の擬似プログラム>> 結果の色 = GrHandleの色 + BlendGrHandleの色; DX_GRAPH_BLEND_SCREEN : スクリーン 加算と同じで明るくなりますが、加算ほど明るくなりません。 <<結果算出の擬似プログラム>> 結果の色 = 1.0f - ( ( 1.0f - GrHandleの色 ) * ( 1.0f - BlendGrHandleの色 ) ); DX_GRAPH_BLEND_OVERLAY : オーバーレイ GrHandle の色の値が 0.5 以下の部分は暗く、0.5 以上の部分は明るくなる合成です。 <<結果算出の擬似プログラム>> if( GrHandleの色 < 0.5 ) { 結果の色 = GrHandleの色 * BlendGrHandleの色 * 2.0; } else { 結果の色 = 2.0 * ( GrHandleの色 + BlendGrHandleの色 - GrHandleの色 * BlendGrHandleの色 ) - 1.0; } DX_GRAPH_BLEND_DODGE : 覆い焼き 計算は複雑ですが加算と同様に合成後の画像は明るくなります。 <<結果算出の擬似プログラム>> if( BlendGrHandleの色 < 1.0 ) { 結果の色 = GrHandleの色 / ( 1.0 - BlendGrHandleの色 ); } else { 結果の色 = 1.0; } DX_GRAPH_BLEND_BURN : 焼き込み 計算は複雑ですが乗算と同様に合成後の画像は暗くなります。 <<結果算出の擬似プログラム>> if( BlendGrHandleの色 > 0 ) { 結果の色 = 1.0 - ( 1.0 - GrHandleの色 ) / BlendGrHandleの色 ; } else { 結果の色 = 0.0; } DX_GRAPH_BLEND_DARKEN : 比較(暗) GrHandle と BlendGrHandle で色の暗い方を合成後の色とします。 <<結果算出の擬似プログラム>> if( BlendGrHandleの色 > GrHandleの色 ) { 結果の色 = GrHandleの色 ; } else { 結果の色 = BlendGrHandleの色 ; } DX_GRAPH_BLEND_LIGHTEN : 比較(明) GrHandle と BlendGrHandle で色の明るい方を合成後の色とします。 <<結果算出の擬似プログラム>> if( BlendGrHandleの色 > GrHandleの色 ) { 結果の色 = BlendGrHandleの色 ; } else { 結果の色 = GrHandleの色 ; } DX_GRAPH_BLEND_SOFTLIGHT : ソフトライト オーバーレイより少し暗い感じです。 <<結果算出の擬似プログラム>> if( BlendGrHandleの色 < 0.5 ) { 結果の色 = pow( GrHandleの色, ( 1.0f - BlendGrHandleの色 ) * 2.0 ) ; } else { 結果の色 = pow( GrHandleの色, 0.5 / BlendGrHandleの色 ); } DX_GRAPH_BLEND_HARDLIGHT : ハードライト オーバーレイは GrHandle の値が 0.5 以上かどうかを判断していましたが、 ハードライトでは BlendGrHandle の値を 0.5 以上かどうかを判断に使用しています。 <<結果算出の擬似プログラム>> if( BlendGrHandleの色 < 0.5 ) { 結果の色 = GrHandleの色 * BlendGrHandleの色 * 2.0; } else { 結果の色 = 2.0 * ( GrHandleの色 + BlendGrHandleの色 - GrHandleの色 * BlendGrHandleの色 ) - 1.0; } DX_GRAPH_BLEND_EXCLUSION : 除外 減算に若干似ています。 <<結果算出の擬似プログラム>> 結果の色 = GrHandleの色 + BlendGrHandleの色 - 2.0 * GrHandleの色 * BlendGrHandleの色; サンプル 画像 Src1.bmp と Src2.tga をオーバーレイ合成してから画面に描画します。 この一括解説で扱われた合成タイプはすべて引数がありませんので、このサンプルの DX_GRAPH_BLEND_OVERLAY の部分を他の合成タイプに置き換えればそのままその合成タイプの サンプルとして見立てることができます。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Handle ; int BlendHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む Handle = LoadGraph( "Src1.bmp" ) ; // ブレンドする画像を読み込む BlendHandle = LoadGraph( "Src2.tga" ) ; // Handle と BlendHandle でオーバーレイ合成を行う GraphBlend( Handle, BlendHandle, 255, DX_GRAPH_BLEND_OVERLAY ) ; // 合成後の画像を画面に描画 DrawGraph( 0, 0, Handle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; } | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル 画像 Src1.bmp と Src2.tga を覆い焼き合成してから画面に描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int SrcHandle ; int DestHandle ; int BlendHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む SrcHandle = LoadGraph( "Src1.bmp" ) ; // ブレンドする画像を読み込む BlendHandle = LoadGraph( "Src2.tga" ) ; // 出力先のグラフィックハンドルを作成する DestHandle = MakeScreen( 256, 256, FALSE ) ; // Handle と BlendHandle で覆い焼き合成を行う GraphBlendBlt( SrcHandle, BlendHandle, DestHandle, 255, DX_GRAPH_BLEND_DODGE ) ; // 合成後の画像を画面に描画 DrawGraph( 0, 0, DestHandle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }元画像 ブレンド画像 合成後 | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
サンプル 画像 Src1.bmp の右下部分と Src2.tga の中心部分を覆い焼き合成してから画面に描画します。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int SrcHandle ; int DestHandle ; int BlendHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込む SrcHandle = LoadGraph( "Src1.bmp" ) ; // ブレンドする画像を読み込む BlendHandle = LoadGraph( "Src2.tga" ) ; // 出力先のグラフィックハンドルを作成する DestHandle = MakeScreen( 128, 128, FALSE ) ; // Handle と BlendHandle で覆い焼き合成を行う GraphBlendRectBlt( SrcHandle, BlendHandle, DestHandle, 128, 128, 256, 256, 64, 64, 0, 0, 255, DX_GRAPH_BLEND_DODGE ) ; // 合成後の画像を画面に描画 DrawGraph( 0, 0, DestHandle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; } | ||||||||||||||||||||||||||||
戻る |