【问题标题】:Can image masking be done efficiently using only bit operations?仅使用位操作可以有效地完成图像屏蔽吗?
【发布时间】:2016-03-17 01:12:27
【问题描述】:

我有一个位图,在将多个图层合成到一个目标位图中时,我需要将其用作图像蒙版。图像掩码是黑白图像,其中黑色指定应该绘制的像素,白色从源位图中绘制像素。

像素均为 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

有什么想法吗?

【问题讨论】:

  • 稍微详细说明一下,我正在考虑使用遮罩像素的 RGB 值来设置 alpha 值。
  • 详细说明你的问题,不要在评论中。

标签: c++ graphics bitmap bitwise-operators mask


【解决方案1】:

下面的get_mask 函数将低位扩展为整个无符号整数值。如果只有黑色或白色像素,这应该足够了。

#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";
}

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 2011-04-07
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多