Re: 動画絵画時の透過について ( No.1 ) |
- 名前:管理人 日時:2023/08/05 00:20
GraphBlendBlt の DX_GRAPH_BLEND_RGBA_SELECT_MIX を使用することでご希望の処理を実現することができます
DX_GRAPH_BLEND_RGBA_SELECT_MIX は GraphBlend や GraphBlendBlt で指定する2つのグラフィックハンドルの
各 赤・緑・青・透明度( アルファ ) の4成分を自由に置き換えたり反転したりすることができる機能なので、
この機能を使用してグラフィックハンドル Screen に以下のように転送することで元の動画の緑色の度合いを
そのまま透明度とすることができます
GraphBlendBlt( Movie, Movie, Screen, 255, DX_GRAPH_BLEND_RGBA_SELECT_MIX,
DX_RGBA_SELECT_SRC_R, // Screen の赤成分に Movie の赤成分を転送
DX_RGBA_SELECT_SRC_R, // Screen の緑成分に Movie の赤成分を転送
DX_RGBA_SELECT_SRC_R, // Screen の青成分に Movie の赤成分を転送
DX_RGBA_SELECT_SRC_INV_G // Screen の透明度成分に Movie の緑成分を反転したものを転送
) ;
↑
こちらの処理を使って実際に真っ白の画面に動画の黒い部分だけを描画するプログラムを
組んでみましたので、よろしければご覧ください m(_ _)m
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int Movie ;
int Screen ;
int Width, Height ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// 背景色を真っ白に変更
SetBackgroundColor( 255,255,255 ) ;
// 画面サイズを設定
SetGraphMode( 500, 500, 32 ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// 動画の読み込み
Movie = LoadGraph( "Movie.mp4" ) ;
// 動画のサイズを取得
GetGraphSize( Movie, &Width, &Height ) ;
// 動画と同サイズのアルファチャンネル付きの画像を作成
Screen = MakeScreen( Width, Height, TRUE ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 動画の再生を開始
PlayMovieToGraph( Movie, DX_PLAYTYPE_LOOP ) ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面のクリア
ClearDrawScreen() ;
// Screen に Movie のRGBAの各チャンネルを置き換えたり反転したりして転送
GraphBlendBlt( Movie, Movie, Screen, 255, DX_GRAPH_BLEND_RGBA_SELECT_MIX,
DX_RGBA_SELECT_SRC_R, // Screen の赤成分に Movie の赤成分を転送
DX_RGBA_SELECT_SRC_R, // Screen の緑成分に Movie の赤成分を転送
DX_RGBA_SELECT_SRC_R, // Screen の青成分に Movie の赤成分を転送
DX_RGBA_SELECT_SRC_INV_G // Screen の透明度成分に Movie の緑成分を反転したものを転送
) ;
// Screen の内容を画面に描画
DrawGraph( 0, 0, Screen, TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
GraphBlend と、GraphBlend の転送先指定版である GraphBlendBlt のリファレンスページはこちらです
<GraphBlend>
https://dxlib.xsrv.jp/function/dxfunc_graph1.html#R3N29
<GraphBlendBlt>
https://dxlib.xsrv.jp/function/dxfunc_graph1.html#R3N30
すみません、今 GraphBlend の DX_GRAPH_BLEND_RGBA_SELECT_MIX の説明を確認したところ
今回の件で使用している DX_RGBA_SELECT_SRC_INV_R などの『値を反転する』系の定義の説明が
抜けていましたので先程追加しました m(_ _;m
|
Re: 動画絵画時の透過について ( No.2 ) |
- 名前:ぴぴん 日時:2023/08/05 10:51
完璧に思った通りの出力を得ることができました。
感謝致します!!!
|
Re: 動画絵画時の透過について ( No.3 ) |
- 名前:ぴぴん 日時:2023/08/05 13:14
何度も申し訳ありません。
上記関数にて色素を置換することで透明化する場合もし素材側が255,255,255の白色エフェクトのグリーンバック素材である場合、
緑の値を反転しαチャンネルに移行させると素材側も消えてしまうということでしょうか?
|
Re: 動画絵画時の透過について ( No.4 ) |
- 名前:管理人 日時:2023/08/06 02:15
> 上記関数にて色素を置換することで透明化する場合もし素材側が255,255,255の白色エフェクトのグリーンバック素材である場合、
> 緑の値を反転しαチャンネルに移行させると素材側も消えてしまうということでしょうか?
はい、グリーンバックで描画したい部分が白色の場合、緑の値を反転してαチャンネルに転送すると全部が
完全な透明( 白色の部分の緑成分は255なので、反転すると0 )になって何も描画されなくなると思いますので、
グリーンバックで描画したい部分が白色の場合は
GraphBlendBlt( Movie, Movie, Screen, 255, DX_GRAPH_BLEND_RGBA_SELECT_MIX,
DX_RGBA_SELECT_SRC_G, // Screen の赤成分に Movie の緑成分を転送
DX_RGBA_SELECT_SRC_G, // Screen の緑成分に Movie の緑成分を転送
DX_RGBA_SELECT_SRC_G, // Screen の青成分に Movie の緑成分を転送
DX_RGBA_SELECT_SRC_R // Screen の透明度成分に Movie の赤成分を転送
) ;
↑
このように置き換える要素を変更する必要があると思います
|
Re: 動画絵画時の透過について ( No.5 ) |
- 名前:初心者 日時:2023/08/06 10:58
なるほど、rgbのg以外が0である故アルファチャンネルと置換できるということですか、絵画部分がカラーである場合や背景が黒である場合などは
加算絵画等他の方法の検討が必要そうですね、
とても参考になりました。誠に感謝致します。
|
|