トップページ > 記事閲覧
他に干渉しないで一部分を透明化
名前:コモリ 日時: 2020/08/11 00:26

動画の背景(黒色)を透明にしたいと考えています。 読み込みの際に透過色を決定するSetTransColorは動画の読み込みでは意味がないと思います。 SetDrawBlendMode(DX_BLENDMODE_ADD, 255); DrawGraph() そこで上記の加算ブレンドをすることで黒色を透過させ動画を描画しました。 しかし、当たり前ですが黒色以外の部分にも加算ブレンドされてしまい、元の動画とは異なったものになってしまいます。 黒だけを透明にすることは可能でしょうか? MakeGraphやMakeScreenで作成した画像は背景を透明にはできないのでしょうか? GraphFilterBltの描画先に裏画面を指定することも不可能でしょうか?
メンテ

Page: 1 |

Re: 他に干渉しないで一部分を透明化 ( No.1 )
名前:コモリ 日時:2020/08/11 21:35

自己解決しました。 MakeGraphやMakeScreenの第三引数にTRUEを渡しておらず、アルファ値が適切に反映されていなかったことが原因でした... 以下の手順で動画の黒を透明化しました。 ・MakeScreenで画面作成 ・作成したScreenに動画を描画 ・GraphFilterのDX_GRAPH_FILTER_BRIGHT_CLIPを使用して黒を透明に ・裏画面に作成したScreenを描画 これ以外に効率的なやり方があれば教えていただきたいです。
メンテ
Re: 他に干渉しないで一部分を透明化 ( No.2 )
名前:管理人 日時:2020/08/12 01:10

> 黒だけを透明にすることは可能でしょうか? コモリさんが試された通り DX_GRAPH_FILTER_BRIGHT_CLIP を使うことで可能です > GraphFilterBltの描画先に裏画面を指定することも不可能でしょうか? 描画先を裏画面にすることは割と簡単にできたので実装してみました、 よろしければこちらをダウンロードしてください 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 10.3 用 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 // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) ↑こちらのバージョンでは GraphFilterBlt の引数 DestGrHandle に DX_SCREEN_BACK を 指定できるようになっています DX_SCREEN_BACK を指定すると出力先が裏画面になりますので、よろしければお試しください m(_ _)m ( 出力先の x, y 座標を指定する場合は GraphFilterBltRect を使用してください ) 今回の機能を使用すると手順が以下のように簡略化されます ・GraphFilterBltRectのDX_GRAPH_FILTER_BRIGHT_CLIPを使用して動画の黒を透明にして裏画面に描画
メンテ
Re: 他に干渉しないで一部分を透明化 ( No.3 )
名前:コモリ 日時:2020/08/12 13:40

対応ありがとうございます。 さっそく、DX_SCREEN_BACKを出力先に指定してGraphFilterBltを使用したところ、 画像、動画は描画されるのですがフィルターの内容は反映されていませんでした。 確認お願い致しますm(*_ _)m 追記 ・Screenを作成 ・GraphFilterBlt(movieHandle, Screen, DX_GRAPH_FILTER_BRIGHT_CLIP, DX_CMP_LESS, 50, TRUE, 0, 0);  を使用してフィルターをかける。 ・裏画面にScreenを描画 ↑の場合だと何も描画されませんでした。 ・Screenを作成 ・Screen2を作成 ・Screen2にmovieHandle(動画)を描画 ・GraphFilterBlt(movieHandle, Screen, DX_GRAPH_FILTER_BRIGHT_CLIP, DX_CMP_LESS, 50, TRUE, 0, 0);  を使用してフィルターをかける。  出力先は「Screen」 ・裏画面にScreenを描画 ↑の場合だと適切に反映されました。 動画の再生にはPlayMovieToGraph(movieHandle);を使用しています。 動画の場合、一度適当な所に描画してからでないと、動画が再生されていない?フィルターが上手く反映されない? 可能性もあるのかなと... ・GraphFilterBlt(movieHandle, DX_SCREEN_BACK, DX_GRAPH_FILTER_BRIGHT_CLIP, DX_CMP_LESS, 50, TRUE, 0, 0); ↑のように裏画面に出力先を指定すると動画をScreen2に描画していなくても、 一応GraphFilterBltは処理され画面にフィルターがかかっていない状態で描画されるので、よくわかりませんが...
メンテ
Re: 他に干渉しないで一部分を透明化 ( No.4 )
名前:管理人 日時:2020/08/12 23:21

> 動画の場合、一度適当な所に描画してからでないと、動画が再生されていない?フィルターが上手く反映されない? > 可能性もあるのかなと... すみません、その通りです… DrawGraph 等の描画関数では内部で描画の前に動画のコマの更新を行っているのですが、 GraphFilter系の関数ではその処理を行っていませんでした… orz GraphFilter系でもフィルター処理の前に動画のコマの更新を行うようにしましたので、 何度も申し訳ありませんが、よろしければこちらの修正版をお試しください 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 10.3 用 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: 他に干渉しないで一部分を透明化 ( No.5 )
名前:コモリ 日時:2020/08/13 23:41

対応ありがとうございます。早速確認してみました。 ・Screenを作成 ・GraphFilterBlt(movieHandle, Screen, DX_GRAPH_FILTER_BRIGHT_CLIP, DX_CMP_LESS, 50, TRUE, 0, 0);  を使用してフィルターをかける。 ・裏画面にScreenを描画 ↑を実行した場合は、適切に反映されました。 ・GraphFilterBlt(movieHandle, DX_SCREEN_BACK, DX_GRAPH_FILTER_BRIGHT_CLIP, DX_CMP_LESS, 50, TRUE, 0, 0); ↑のように裏画面に直接描画した場合、動画は描画も再生もされます。 しかし、アルファ値が反映されていません。色は反映されています。 確認お願い致しますm(*_ _)m
メンテ
Re: 他に干渉しないで一部分を透明化 ( No.6 )
名前:管理人 日時:2020/08/14 01:30

> しかし、アルファ値が反映されていません。色は反映されています。 すみません、そういえば GraphFilterBlt は関数の性質上転送先にはブレンド処理や 透過色処理などを一切せずそのまま転送しているのでした… orz GraphFilterBlt で転送先にフィルター結果を転送する際のブレンドモードを設定するための 関数を追加しましたので、本当に何度も申し訳ありませんが、よろしければこちらを ダウンロードしてください 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 10.3 用 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 // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) 以下の関数を追加しました // GraphFilterBlt や GraphBlendBlt の結果を転送先に転送する際のブレンドモードを設定する // int BlendMode : ブレンドモード( 現状で対応しているのは DX_BLENDMODE_NOBLEND と DX_BLENDMODE_ALPHA のみ ) int SetGraphFilterBltBlendMode( int BlendMode /* DX_BLENDMODE_ALPHA など */ ) ; SetDrawBlendMode の GraphFilterBlt 用です ただ、注釈にもあります通り現状対応しているのは DX_BLENDMODE_NOBLEND と DX_BLENDMODE_ALPHA のみとなります こちらを GraphFilterBlt を実行する前に SetGraphFilterBltBlendMode( DX_BLENDMODE_ALPHA ); と DX_BLENDMODE_ALPHA を渡して呼び出しておくと、 GraphFilterBlt(movieHandle, DX_SCREEN_BACK, DX_GRAPH_FILTER_BRIGHT_CLIP, DX_CMP_LESS, 50, TRUE, 0, 0); ↑こちらでもアルファ値が反映されて描画されます よろしければお試しください m(_ _)m
メンテ
Re: 他に干渉しないで一部分を透明化 ( No.7 )
名前:コモリ(解決) 日時:2020/08/14 15:59

無事解決しました。 対応ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存