DerivationGraph を使う方法とは異なりますが
『グラフィックハンドルAの一部を円形に切り抜いた画像( グラフィックハンドルB )を作成する』
ことは可能です
リファレンスには載っていませんが、GraphBlend や GraphBlendBlt に使えるフィルタータイプに
DX_GRAPH_BLEND_MULTIPLE_A_ONLY という、二つのグラフィックハンドルのアルファチャンネルのみを
乗算するというものがありますので、これを使用して
1.グラフィックハンドルAと同じ大きさの『作業用のスクリーン』と『最終結果代入用スクリーン』を作成
2.作業用のスクリーンに円を描画
3.グラフィックハンドルAと作業用スクリーンを DX_GRAPH_BLEND_MULTIPLE_A_ONLY で合成して
その結果を『最終結果代入用スクリーン』に代入
↑このような処理を行うことで『円の内側はそのまま、外側はすべてalpha = 0』の
グラフィックハンドルを作成することができます
上記の処理を Test1.bmp に対して行うサンプルプログラムを組んでみましたので、よろしければご覧ください m(_ _)m
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
int GrHandle ;
int WorkHandle ;
int Gr2Handle ;
int SizeX, SizeY ;
// ウインドウモードに変更
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
return -1 ;
// Test1.bmp を読み込み
GrHandle = LoadGraph( "Test1.bmp" ) ;
// Test1.bmp のサイズを取得
GetGraphSize( GrHandle, &SizeX, &SizeY ) ;
// Test1.bmp と同じサイズの合成結果を書き込む用のスクリーンを作成
Gr2Handle = MakeScreen( SizeX, SizeY, TRUE ) ;
// Test1.bmp と同じサイズの作業用スクリーンを作成
WorkHandle = MakeScreen( SizeX, SizeY, TRUE ) ;
// 描画先を作業用スクリーンに変更
SetDrawScreen( WorkHandle ) ;
// 作業用スクリーンをクリア
ClearDrawScreen() ;
// 作業用スクリーンの上の方に円を描画
DrawCircle( SizeX / 2, SizeY / 4, SizeX / 2, TRUE ) ;
// Test1.bmp に 作業用スクリーンのアルファチャンネルを乗算して
// その結果を合成結果を書き込む用のスクリーンに書き込む
GraphBlendBlt( GrHandle, WorkHandle, Gr2Handle, 255, DX_GRAPH_BLEND_MULTIPLE_A_ONLY ) ;
// 作業用スクリーンの削除
DeleteGraph( WorkHandle ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 抜き出し結果が分かりやすいように画面全体を灰色で描画
DrawBox( 0, 0, 640, 480, GetColor( 128,128,128 ), TRUE ) ;
// 合成結果のスクリーンを画面に描画
DrawGraph( 0, 0, Gr2Handle, TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
> 円形だけでなく、回転した長方形などで切り抜きができたらよいのですが。
『作業用スクリーン』に対する描画を DrawCircle ではなく、DrawQuadrangle で回転した
長方形にすることで『回転した長方形などで切り抜き』にすることが可能です
DrawQuadrangle もリファレンスに載っていませんが、以下のような関数となっています
// 四角形を描画する
// x1, y1 : 描画する四角形の左上の座標
// x2, y2 : 描画する四角形の右上の座標
// x3, y3 : 描画する四角形の右下の座標
// x4, y4 : 描画する四角形の左下の座標
// Color : 描画する四角形の色
// FillFlag : 描画する四角形の中身を塗りつぶすかどうか( TRUE:塗りつぶす FALSE:塗りつぶさない )
int DrawQuadrangle( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, unsigned int Color, int FillFlag ) ;
注釈には『左上・右上・右下・左下』と書いてありますが、要は右回りの順番で座標を指定する
必要があるというだけです、例えばこちらを使ってサンプルプログラムの
DrawCircle( SizeX / 2, SizeY / 4, SizeX / 2, TRUE ) ;
この行を
DrawQuadrangle( 0, SizeY / 4, SizeX / 2, 0, SizeX, SizeY / 4, SizeX / 2, SizeY / 2, GetColor( 255,255,255 ), TRUE ) ;
↑このようにすると Test1.bmp の上部が菱形に切り抜かれた画像となります
よろしければお試しください m(_ _)m