トップページ > 記事閲覧
メモリに読み込んだグラフィックの複雑な抜き出し
名前:yoshibi 日時: 2020/11/04 10:48

こんにちは。 便利なツールをありがとうございます。 メモリに読み込んだグラフィックを円形に切り抜きたいです。(例、円の内側はそのまま、外側はすべてalpha = 0にしたい) DerivationGraphでは長方形で切り抜くことができると思うのですが、上記のようなより複雑な図形での切り抜きはできますでしょうか? 円形だけでなく、回転した長方形などで切り抜きができたらよいのですが。 よろしくお願いします。 yoshibi
メンテ

Page: 1 |

Re: メモリに読み込んだグラフィックの複雑な抜き出し ( No.1 )
名前:管理人 日時:2020/11/04 23:18

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
メンテ
Re: メモリに読み込んだグラフィックの複雑な抜き出し ( No.2 )
名前:yoshibi 日時:2020/11/09 14:09

管理人様 迅速な回答ありがとうございます。 返信が遅れて申し訳ありません。 わかりやすいサンプルコードまで、用意していただいてありがとうございました。 私の環境で試してみたところ、切り抜いた画像が表示されることを確認できました。 大変参考になりました、ありがとうございました。 よろしくお願いいたします。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存