17

RGBAイメージ(フォアグラウンドイメージ)、RGBイメージ(バックグラウンドイメージ)のアルファブレンド操作を実行しようとしています。しかし、そうしている間、私は間違ったアルファブレンディング操作を行っているか、または間違っていると思う。たとえば、私のRGB画像のピクセルは(127,127,127)の灰色がかった色です。ピクセルのRGBAイメージのピクセルは(0、0、255)になります。ブレンド操作を実行すると、最終的な色は(127、0、255)になります。しかし、私は、これが追加のブレンドであり、私がやっている操作とは異なると思っていました。私の値が設定されている方法についてはRGBAピクセルとRGBピクセルを手動でアルファブレンディングする

は、私は希望、アルファなしでピクセルの場合、この

float incAlpha = (currentPixelColor[3]/255.0f); 

float red = ((float)incPixelColor[0]/255.0f * incAlpha) + ((float)currentPixelColor[0]/255.0f); 
float green = ((float)incPixelColor[1]/255.0f * incAlpha) + ((float)currentPixelColor[1]/255.0f); 
float blue = ((float)incPixelColor[2]/255.0f * incAlpha) + ((float)currentPixelColor[2]/255.0f); 


currentPixelColor[0] = min(red * 255, 255.0f); 
currentPixelColor[1] = min(green * 255, 255.0f); 
currentPixelColor[2] = min(blue * 255, 255.0f); 

を見て、私の計算が設定されている方法については、この

incPixelColor[0] = 0; (red) 
incPixelColor[1] = 0; (green) 
incPixelColor[2] = 255; (blue) 
incPixelColor[3] = 255; (alpha) 

currentPixelColor[0] = 127; (red) 
currentPixelColor[1] = 127; (green) 
currentPixelColor[2] = 127; (blue) 

を見てみましょう値が(0、0、255)であるのと同様に、アルファのある画像ではブレンドしたいと思います。上記の操作の最後では、(127,127,255)になります。すべてのピクセルにアルファがあるかどうかを調べる必要がありますか?その場合は、ブレンドするか、これを行う別の方法がありますか?

+0

を逃しているようです。 y =(x0 * w)+(x1 *(1-w)) –

+1

これは、前後に255のスケーリングが多いことを示しています。あなたの操作が正規化を維持している場合、それは必要ではありません。 – fche

答えて

22

ブレンド「オーバー」典型的には、以下の方法で行われます。

outputRed = (foregroundRed * foregroundAlpha) + (backgroundRed * (1.0 - foregroundAlpha)); 

そして青と緑のチャネルについて繰り返します。これはすべてのピクセルで行います。

+0

おそらく私は間違っていますが、それは私がすでにやっていることではありませんか? – mmurphy

+0

いいえ、あなたがやっていることは、outputRed =(foreRed * foreAlpha)+ backgroundRedです。 backgroundRedに(1.0 - foreAlpha)を掛ける必要があります。 – user1118321

+0

あまりにも遅いですが、宛先ピクセルとソースピクセルの両方が透明であれば、アルファ出力アルファチャンネルはどうなりますか? –

2

あなたが添加剤の配合をやっている背景について(1アルファ)乗数(currentPixelColor)

関連する問題