トップページ > 記事閲覧
GraphFilter関数のDX_GRAPH_FILTER_REPLACEMENTの仕様が分からない
名前:いれぶん 日時: 2025/09/04 13:08

いつもdxlibを使わせてもらってます。いれぶんといいます。 現在、背景透過して動画を再生する関数を作成しているのですが、 グリーンバックの動画を背景透過することができません。 背景が黒と白の時はDX_GRAPH_FILTER_BRIGHT_CLIPを使用して透過することができたのですが、 グリーンバックはこれではうまくいかなかったので調べたところ、 DX_GRAPH_FILTER_REPLACEMENTで色を直接指定してできるということだったのでやってみたのですがうまくいきませんでした。 引数などを確認しても特に間違ってそうなところが分かりませんでした。 下記にコードを置いておきますので、お時間がある時でかまいませんので、間違ってるところがあったら教えていただきたいです。 /// <summary> /// 背景透過動画再生関数 /// </summary> /// <param name="movieHandle">動画ハンドル</param> /// <param name="screenHandle">スクリーンハンドル※MakeScreen関数でハンドルを作ってその時に第三引数をTRUEにする必要がある</param> /// <param name="movieBackColorType">動画背景色のタイプ(0:黒, 1:緑, 2:白を指定する)</param> /// <param name="movieWidht">動画幅</param> /// <param name="movieHeght">動画高さ</param> /// <param name="position">動画座標</param> /// <param name="isLoop">動画をループするか</param> /// <param name="screenType">最終的に描画するとこのスクリーンハンドル</param> void PlayTransparentMovie(int movieHandle, int screenHandle, unsigned short movieBackColorType, int movieWidht, int movieHeight, VECTOR position, bool isLoop, int screenType) { //スクリーンハンドルに動画を描画する SetDrawScreen(screenHandle); //ループ再生するかどうか if (isLoop) { PlayMovieToGraph(movieHandle, DX_PLAYTYPE_LOOP); } else { PlayMovieToGraph(movieHandle); } DrawExtendGraph(position.x, position.y, position.x + movieWidht, position.y + movieHeight, movieHandle, TRUE); //元のスクリーンハンドルに戻す SetDrawScreen(screenType); //スクリーンハンドルを画像として透過してから描画 //背景の色によって透過する色を変える if (movieBackColorType == 0)//黒 { GraphFilter(screenHandle, DX_GRAPH_FILTER_BRIGHT_CLIP, DX_CMP_LESS, 10, TRUE, GetColor(0, 255, 0), 0); } else if (movieBackColorType == 1)//緑 { //GraphFilter(screenHandle, DX_GRAPH_FILTER_BRIGHT_CLIP, DX_CMP_LESS, 128, TRUE, GetColor(0, 0, 0), 0); GraphFilter(screenHandle, DX_GRAPH_FILTER_REPLACEMENT, 0, 255, 0, 255, 0, 0, 0, 0); } else//白 { GraphFilter(screenHandle, DX_GRAPH_FILTER_BRIGHT_CLIP, DX_CMP_GREATER, 245, TRUE, GetColor(0, 255, 0), 0); } DrawExtendGraph(position.x, position.y, position.x + movieWidht, position.y + movieHeight, screenHandle, TRUE); }
メンテ

Page: 1 |

Re: GraphFilter関数のDX_GRAPH_FILTER_REPLACEMENTの仕様が分からない ( No.1 )
名前:管理人 日時:2025/09/06 01:30

DX_GRAPH_FILTER_REPLACEMENT の引数は 置き換えたい色のR値, 置き換えたい色のG値, 置き換えたい色のB値, 置き換えたい色のA値, 置き換え後の色のR値, 置き換え後の色のG値, 置き換え後の色のB値, 置き換え後の色のA値 となっていますので、0, 255, 0, 255, 0, 0, 0, 0 で指定は合っています 少し気になったのですがこちらの関数は動画再生開始の際に一度だけ呼ばれるのでしょうか? 仮にそうだとしますと screenHandle には動画の再生開始直後のフレーム( フレーム0 )のみが 描画されるだけで、フレーム1以降の動画映像は screenHandle には描画されないことになりますが…
メンテ
Re: GraphFilter関数のDX_GRAPH_FILTER_REPLACEMENTの仕様が分からない ( No.2 )
名前:いれぶん 日時:2025/09/06 08:59

管理人さん、返信ありがとうございます。 この関数は動画を再生したいときは毎フレーム呼び出すように作ってます(処理が重いかどうかは置いといて)。 よって、管理人さんが懸念してるようなことは起こらないと思います。 う〜ん、だとすると他に何が間違ってるか見当がつかないですね... 一般的なグリーンバックのカラーコードは0,255,0になってると調べたら出てきたのでこれでいけるとできると思ったのですが... もう一度自分でいろいろ試してみます
メンテ
Re: GraphFilter関数のDX_GRAPH_FILTER_REPLACEMENTの仕様が分からない ( No.3 )
名前:いれぶん 日時:2025/09/07 16:20

色々試した結果できませんでした。 動画のグリーンバックをカラーピッカーで調べたところ、0,255,1となってのでこのカラーコードどうりにGraphFilterでやってみたところ、透過できませんでした。 自分なりに理由を考えてみたのですが動画のカラーコードの基準がdxlibとカラーピッカーで違う可能性があるのではないでしょうか。 GetPixel関数でカラーコードを調べてもRGBの値でないのでRGBの値を返す関数見ないな関数はないのでしょうか?
メンテ
Re: GraphFilter関数のDX_GRAPH_FILTER_REPLACEMENTの仕様が分からない ( No.4 )
名前:管理人 日時:2025/09/08 03:26

GetPixel で取得した値を RGB の値にする関数としてリファレンスには載っていませんが GetColor2 という関数があります // カラー値から赤、緑、青の値を取得する int GetColor2( unsigned int Color, int *Red, int *Green, int *Blue ) ; // 使用例 int Color ; int R, G, B ; Color = GetPixel( 0, 0 ) ; GetColor2( Color, &R, &G, &B ) ; よろしければお使いください m(_ _)m
メンテ
Re: GraphFilter関数のDX_GRAPH_FILTER_REPLACEMENTの仕様が分からない ( No.5 )
名前:いれぶん 日時:2025/09/08 12:18

管理人さんありがとうございます!! 早速使わせてもらったところRGBが常に255になり白と判定していることになってます。もちろん動画を再生していてもです。DrawBoxなどで画面を他の色で満たしてもなります。 私がGetColor2の使い方を間違えている可能背もありますが何かしらがバグってるように見えます。コードも置いておきます #include "DxLib.h" #include "DxLibForIreven.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int MovieGraphHandle; if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが発生したら終了 } // ムービーファイルをロードします。 MovieGraphHandle = LoadGraph("movie/test.mp4"); int test = MakeScreen(1920, 1080, TRUE); int Color; int R, G, B; // ループ、GetMovieStateToGraph 関数はムービーの再生状態を得る関数です // 戻り値が1の間は再生状態ですのでループを続けます while (ScreenFlip() == 0 && ClearDrawScreen() == 0 && ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) { DrawBox(0, 0, 1920, 1080, GetColor(255, 0, 0), TRUE); //PlayTransparentMovie(MovieGraphHandle, test, 0); Color = GetPixel(1920 / 2, 1080 / 2); GetColor2(Color, &R, &G, &B); DrawFormatString(0, 0, GetColor(255, 255, 255), "R:%d G:%d B:%d", R, G, B); } // 読み込んだムービーファイルのグラフィックハンドルの削除 DeleteGraph(MovieGraphHandle); DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
メンテ
Re: GraphFilter関数のDX_GRAPH_FILTER_REPLACEMENTの仕様が分からない ( No.6 )
名前:管理人 日時:2025/09/09 00:35

載せていただいたコードは GetPixel が画面外の座標を指定しているため、戻り値が -1 となっていて、 それが原因で GetColor2 で取得できる値が RGB 共に 255 となっているようです ( DXライブラリはデフォルトでは 640x480 の解像度ですが、GetPixel で指定されている座標が  960, 540 となっていて、画面外の座標となっています ) DxLib_Init() の前に SetGraphMode( 1920, 1080, 32 ); という記述を増やして実行したところ、 R:255 G:0 B:0 と画面に表示されました ( あと SetDrawScreen( DX_SCREEN_BACK ); の記述が無く画面がチカチカしていたので、 メインループの前に SetDrawScreen( DX_SCREEN_BACK ); の記述も増やしました ) よろしければ SetGraphMode( 1920, 1080, 32 ); の記述を増やした上で再度試してみてください m(_ _)m
メンテ
Re: GraphFilter関数のDX_GRAPH_FILTER_REPLACEMENTの仕様が分からない ( No.7 )
名前:いれぶん(お蔵入り) 日時:2025/09/09 09:53

管理人さんありがとうございます!圧倒的感謝です!! デバッグ用のコードだったので画面設定系の部分を完全に忘れてました。 試しにやってみたところ、私の予想通りGetColor2で取得するカラーコードと他のカラーピッカーなどで取得するカラーコードが違ったみたいです。 しかし、GetColor2で取得したカラーコード通りにしてもぱっと見で緑があるとわかるぐらい残ってしまいました。 自分ではこれ以上対処法が思いつかないのでグリーンバックに対応するのはお蔵入りとします。 管理人さんお手数おかけしました。
メンテ

Page: 1 |

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

   クッキー保存