0

ここに私のジレンマがあります: RGBA RAW 画像: マスター画像 (1 つ目) とサブタイトル トラック (2 つ目) が必要で、2 つ目の画像のアルファ チャネルに基づいた方法でそれらをオーバーレイしたい: ゼロの場合、次に、2 番目の画像からピクセルを取得します。0xFF の場合は、最初の画像からピクセルを取得します。それ以外の場合は、最初の画像に 2 番目の画像のオーバーレイを作成します。これに使用されるコードは次のとおりです。

if(frame->bytes[pc + 3] == 0xFF) /* this is NO transparency in the overlay image, meaning: take over the overlay 100% */
{
    pFrameRGB->data[0][pc] = frame->bytes[pc];    // Red
    pFrameRGB->data[0][pc+1] = frame->bytes[pc+1];// Green 
    pFrameRGB->data[0][pc+2] = frame->bytes[pc+2];// Blue 
}
else
if(frame->bytes[pc + 3] != 0) /* this is full transparency in the overlay image, meaning: take over the image 100% */
{
    pFrameRGB->data[0][pc] |= frame->bytes[pc];    // Red
    pFrameRGB->data[0][pc+1] |= frame->bytes[pc+1];// Green 
    pFrameRGB->data[0][pc+2] |= frame->bytes[pc+2];// Blue
    pFrameRGB->data[0][pc+3] = frame->bytes[pc+3]; // Alpha 
}

上記のコードでは、pFrameRGB はターゲット RGBA 画像であり、すでにそこに何らかの画像が含まれています。カラフル...だから、得たい効果を字幕画像がオーバーレイされているわけではありませんが、色の全範囲を見ることができます(たとえば、アルファが増加する赤/緑のオーバーレイ画像があり、オーバーレイが欲しいその下に画像がある「淡い」赤/緑のオーバーレイのように見える画像ですが、上記のアプローチでは、下の画像に多くのカラフルなピクセルが表示されます)。これに対するもう少し良いアプローチはありますか?

ありがとう、フリッツォーネ

4

1 に答える 1

6

アルファ ブレンディングを行うための方程式は、単なるビット論理和よりも複雑です。RGB の線形応答モデルを仮定すると、非常に一般的な実装は次のようになります。

dst_R = (src_R*src_A + dst_R*(255 - src_A)) / 255;
dst_G = (src_G*src_A + dst_G*(255 - src_A)) / 255;
dst_B = (src_B*src_A + dst_B*(255 - src_A)) / 255;
dst_A = min(src_A + dst_A, 255);
于 2010-08-04T07:38:59.507 に答える