2016-03-17 22 views
1

我有一個位圖,我需要將多個圖層合併到一個目標位圖時用作圖像蒙版。圖像蒙板是黑色的&白色圖像,其中黑色指定應該繪製而不是的像素,並且白色從源位圖繪製像素。只使用位操作可以有效完成圖像遮罩嗎?

像素都是32位ARGB格式。

如上所述,掩模中的像素爲黑色(0xFF000000)或白色(0xFFFFFFFF)。

我想要一個快速有效的方法來組合屏蔽像素與位圖中的像素,以便僅使用位操作進行繪製。如果剪裁的黑色像素的alpha值爲0,那麼這將是微不足道的 - 那麼我可以只對屏蔽像素和位圖像素進行AND操作。

是否有任何種類的位飽和指令,或類似的東西?我在想:

uint mask = maskPixel & 0x00FFFFFF; 
saturate(mask); 
// If the maskPixel was black, mask will be all 0s, so the result of saturation is still all 0s. 
// If the maskPixel was white, mask will be 0x00FFFFFF, so the saturation will result in 0xFFFFFFFF 

任何想法?

+0

爲了詳細闡述一下,我正在考慮使用掩膜像素的RGB值以某種方式設置alpha值。 – Chris

+1

詳細闡述你的問題,*不*評論。 – Borgleader

回答

0

get_mask函數將低位擴展爲整個unsigned int值。如果只有黑色或白色像素,這應該是足夠的。

#include <iostream> 
#include <iomanip> 

unsigned int get_mask(unsigned int pixel) { 
    return ~((pixel & 1)-1); 
} 

int main() { 
    const unsigned int white = 0x00ffffff; 
    const unsigned int black = 0x00000000; 
    std::cout << std::hex << std::setfill('0'); 
    std::cout << std::setw(8) << white << " => " << std::setw(8) << get_mask(white) << "\n"; 
    std::cout << std::setw(8) << black << " => " << std::setw(8) << get_mask(black) << "\n"; 
}