代码之家  ›  专栏  ›  技术社区  ›  Chris

仅使用位操作就能有效地进行图像掩蔽吗?

  •  1
  • Chris  · 技术社区  · 10 年前

    我有一个位图,当将多个层合成到一个目标位图时,我需要将其用作图像遮罩。图像掩模是黑色&白色图像,其中黑色指定应 不 白色从源位图中绘制像素。

    像素均为32位ARGB格式。

    如上所述,遮罩中的像素为黑色(0xFF000000)或白色(0xFFFFFF)。

    我正在想一种快速有效的方法,将遮罩像素与位图中的像素结合起来,只需使用位操作即可绘制。如果用于裁剪的黑色像素的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
    

    有什么想法吗?

    1 回复  |  直到 10 年前
        1
  •  0
  •   Christopher Oicles    10 年前

    这个 get_mask 下面的函数将低位扩展为整个无符号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";
    }