2010-08-04 69 views
0

下面是我的困境:我必須使用RGBA RAW圖像:主圖像(第一張)和副標題曲目(第二張),並且我想以基於第二個圖像的alpha通道:如果它爲零,則從第二個圖像中取像素,如果它是0xFF取第一個圖像的像素,否則在第一個圖像上創建第二個圖像的重疊。下面是用於此代碼:如何將覆蓋透明度應用於RGBA圖像

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圖像,已經包含SOMET形象出現,幀 - >字節的「疊加/字幕」的形象......這裏來我的問題是:有些彩色疊加/字幕圖像的目的地太多色彩...所以它不像字幕圖像覆蓋了我想獲得的效果,但是您可以看到一系列的顏色(例如:我有一個紅色/綠色覆蓋圖像,並且我希望覆蓋圖像看起來像是一個「蒼白」的紅色/綠色覆蓋圖,下面是圖像,但是通過上面的方法,我在下面的圖像上獲得了很多彩色像素)。你有沒有更好的方法呢?

謝謝, fritzone

+0

什麼庫?什麼語言? – Oded 2010-08-04 07:27:41

回答

6

做alpha混合的等式不僅僅是一個按位或更復雜。假設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); 
+0

謝謝,它的工作完美。 – fritzone 2010-08-04 08:10:57

+0

這真的幫助我感謝 – craigrs84 2013-04-22 02:55:48