2017-01-12 11 views

答えて

0

私は同じことをやろうとしていましたが、残念ながら私はそれをやり遂げるためのきれいな方法を見つけることができませんでした。私のソリューションでは、記録されたフレームの後処理が必要で、非表示にするレイヤーが半透明のオーバーレイ(すべてのピクセルにはアルファベットが<である必要があります)の場合にのみ機能します。

アイデアは、Androidビューコンポジターで実行されるアルファブレンディングを逆転させることです。

ましょうクレドCgreenCblueとCalphaがあなたのオーバーレイの色成分であることとをブレッドせ、BgreenBblueが背景にあるもののための色成分も。あなたが非表示にするオーバレイ層の正確なビットマップを持っている場合、あなたはこのような背景色を再構築することができます

Ored = Bred * (1 - Calpha) + Cred * Calpha 
Ogreen = Bgreen * (1 - Calpha) + Cgreen * Calpha 
Oblue = Bblue * (1 - Calpha) + Cblue * Calpha 

:各画素ごとに、あなたのフレームに表示されます最終的な色は、次式で与えられます:

Bred = (Ored - Cred * Calpha)/(1 - Calpha) 
Bgreen = (Ogreen - Cgreen * Calpha)/(1 - Calpha) 
Bblue = (Oblue - Cblue * Calpha)/(1 - Calpha) 

もちろん、色は最終的に8ビット整数に変換されるため、処理中に一部の情報が失われます。したがって、再構成は視覚的なアーティファクトを生成する可能性がありますが、常に黒いオーバーレイよりもよく見えるはずです。アーティファクトはオーバーレイのアルファチャンネルによって多かれ少なかれ発音されます(アルファ値が0に近いほど、背景色をより正確に再現できます)。

これは、フル解像度の画像でのみ機能します。どんな種類のスケーリングまたは非可逆圧縮もこの手法を破ります。ストレージの制限のため、この後処理は、シェーダパスでSurfaceTextureを使用してリアルタイムで実行される場合にのみ有効です。

関連する問題