トップページ > 記事閲覧
動画から2つの指定したRGB値に入っているピクセルを透過したい
名前:aiueo君 日時: 2025/03/09 00:07

管理人様、いつもDxLibでお世話になっております。 現在、「mp4形式の動画のグリーンバックまたはブルーバックを透過して描画する」といったことをしたいのですが、 GraphFilter関数のDX_GRAPH_FILTER_REPLACEMENTを用いて透過しようとした際に、1つの決まったRGB値しか透過できないため、 あまり期待した結果を得ることができませんでした。(指定した色と少し異なるところが一部が残ってしまう) また、過去に以下のスレッドがあったため、こちらも参考にしてみたのですが、 「色成分を透過する」というものの影響により、少しでも指定した色成分が入っているところはその分透過され薄くなり透けてしまうため、 こちらも理想的な結果にはなりませんでした。 https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=5522 私の思いついた強引な解決方法として、 GraphFilter関数のDX_GRAPH_FILTER_LEVELを用いてコントラストを上げてからDX_GRAPH_FILTER_REPLACEMENTで透過するとある程度は透過できたのですが、 コントラストが少し上げただけでは透過の精度がイマイチなのと、かといってコントラストを上げすぎると元の動画と差が出てしまい少し微妙でした。 そこで相談したいことなのですが、 DX_GRAPH_FILTER_REPLACEMENTの拡張版(?)みたいなもので、「2つの指定したRGB値に入っているピクセルを透過する」といった機能を追加することは可能でしょうか? 例えば、以下のような形です。 GraphFilter( int MovieHandle, int DX_GRAPH_FILTER_REPLACEMENTの拡張版, int r1, int g1, int b1, int a1, // 指定する1つ目のRGBA int r2, int g2, int b2, int a2, // 指定する2つ目のRGBA int R, int G, int B, int A, // 置換後のRGBA ); もし似たような機能が既に存在していたら、私の調査不足になります。申し訳ございません。 難しい場合は先程の強引な解決方法にしようと思いますが、自分の中でどうにも諦めきれず、管理人様に助けを求めることにしました。 一応、以下に汚いですが私の試していたコードを載せておきます。 私が間違っていたり他に良い方法があればアドバイスを是非ご教授いただきたいです。m(_ _)m どうぞよろしくお願いいたします。 ```C++ #include "DxLib.h" #include <fstream> using namespace std; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // exe起動時にLog.txtを出力しない SetOutApplicationLogValidFlag(FALSE); SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); // ウィンドウモードにする ChangeWindowMode(TRUE); // ウィンドウタイトルを設定 SetWindowText("動画透過"); // ウィンドウのサイズを設定 SetGraphMode(600, 450, 16); // ウィンドウのサイズ変更を不可にする SetWindowSizeChangeEnableFlag(FALSE); SetDoubleStartValidFlag(FALSE); // 非アクティブ時でも実行を継続する設定 SetAlwaysRunFlag(TRUE); // 垂直同期(TRUEだとFPS固定、FALSEだとPCの最大FPS) SetWaitVSyncFlag(TRUE); // Dxライブラリ初期化処理 if (DxLib_Init() == -1) { return -1; // エラーが起きたら直ちに終了 }   // 描画先を裏画面にする SetDrawScreen(DX_SCREEN_BACK); // ライティングは行わない SetUseLighting(FALSE); int MHandle = LoadGraph("GB.mp4"); int W, H; GetGraphSize(MHandle, &W, &H); int Screen = MakeScreen(W, H, TRUE); SetBackgroundColor(200, 200, 200); PlayMovieToGraph(MHandle); // メインループを追加 while (ProcessMessage() == 0 && ClearDrawScreen() == 0) { ClearDrawScreen(); // ESCキーが押されたら終了 if (CheckHitKey(KEY_INPUT_ESCAPE)) break; if (CheckHitKey(KEY_INPUT_SPACE)) { PauseMovieToGraph(MHandle); SeekMovieToGraph(MHandle, 0); PlayMovieToGraph(MHandle); } /* // これだと期待した結果を得られなかった GraphBlendBlt(MHandle, MHandle, Screen, 0, DX_GRAPH_BLEND_RGBA_SELECT_MIX, DX_RGBA_SELECT_SRC_R, DX_RGBA_SELECT_SRC_G, DX_RGBA_SELECT_SRC_B, DX_RGBA_SELECT_SRC_INV_G // 緑成分を透過 ); */ // コントラストを上げて、置換対象の色(今回は(0,255,0))に近い色をその色に近づける GraphFilterBlt(MHandle, Screen, DX_GRAPH_FILTER_LEVEL, 30, 225, 120, 0, 255); // 色の置換フィルタで特定の色を透明に GraphFilter(Screen, DX_GRAPH_FILTER_REPLACEMENT, 0, 255, 0, 255, // 置換対象の色 0, 0, 0, 0 // 置換後の色 (透明) ); // ここの/3はただサイズを調節してるだけ DrawExtendGraph(0, 0, W/3, H/3, Screen, TRUE); // ウィンドウの更新 ScreenFlip(); } DxLib_End(); return 0; // ソフトの終了 } ```
メンテ

Page: 1 |

Re: 動画から2つの指定したRGB値に入っているピクセルを透過したい ( No.1 )
名前:管理人 日時:2025/03/10 01:33

mp4 を透過機能付きで描画されたいということでしょうか? DXライブラリには『動画の右側半分をアルファチャンネルに見立てる』という機能がありまして、 それを使用すると mp4 を透過情報( アルファチャンネル )付き動画として扱うことができるのですが、 この機能で aiueo君さんの意図する処理を行うことはできますでしょうか? // 読み込む動画ファイル映像の右半分の赤成分をα情報として扱うかどうかを設定する // Flag TRUE:α情報として扱う FALSE:α情報として扱わない( デフォルト ) int SetMovieRightImageAlphaFlag( int Flag ) ; 例えばこちらの動画 https://dxlib.xsrv.jp/temp/AlphaMovie.mp4 は右側半分が白のシルエットのような動画となっていますが、SetMovieRightImageAlphaFlag( TRUE ); を実行した状態でこの動画を LoadGraph で読み込むと右側半分が透過情報( アルファチャンネル )として 扱われ、DrawGraph で描画すると左側半分の画像と右側半分の画像が合成されます ( なので画面にはキャラクターの部分以外の部分が透過された画像が描画されます ) この機能を使用するとグリーンバックを透過するよりも正確に意図した箇所を透過できると思うのですが、 如何でしょうか? と、ここまで説明して実際に試してみたところ、Ogg Theora 形式の動画ファイル以外では SetMovieRightImageAlphaFlag の機能が効かないことが判明したので、Ogg Theora 形式以外の 動画でも SetMovieRightImageAlphaFlag の機能が効くように処理を追加しました もしよろしければこちらの修正版をダウンロードしてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 12 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: 動画から2つの指定したRGB値に入っているピクセルを透過したい ( No.2 )
名前:aiueo君(解決) 日時:2025/03/13 13:05

すみません。私情により返事が遅れてしまいました。 > DXライブラリには『動画の右側半分をアルファチャンネルに見立てる』という機能がありまして、 それを使用すると mp4 を透過情報( アルファチャンネル )付き動画として扱うことができるのですが、 この機能で aiueo君さんの意図する処理を行うことはできますでしょうか? 修正版をダウンロードし、管理人様の通りにやってみたところ、無事理想的な結果を得ることができました! こちらのやり方の方が精度も良いですし、ScreenやFilterを使用しないため処理も軽くなりそうなので、こちらのやり方でやろうと思います。 本当にありがとうございました。m(_ _)m
メンテ

Page: 1 |

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

   クッキー保存