是否可以仅使用位操作有效地完成图像屏蔽
Can image masking be done efficiently using only bit operations?
我有一个位图,在将多个图层合成为一个目标位图时,我需要将其用作图像蒙版。图像蒙版是黑白图像,其中黑色指定不应绘制的像素,白色从源位图中绘制像素。
像素均为 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
有什么想法吗?
下面的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";
}
相关文章:
- 有效地使用std::unordered_map来插入或增加键的值
- 如何有效地在 std::vector 中插入一对?
- 有效地计算多维数组的累积和?
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 有效地将大数存储为 2 的幂用于路径问题
- 如何在C++中写入 1000 个文件时有效地缓冲
- 如何有效地找到数组中三元组和的最小差异?
- 如何在C++中有效地将数字值重新分配给字符数组
- C++有效地找到向量中第一个最接近的匹配值?
- 如何有效地操作满足给定谓词的向量中的所有项目?
- 有效地将数据加载到 std::vector 中<char>
- 如何在使用 cin 请求 int 时有效地使用户输入万无一失?
- C++:有效地将Sha256摘要放入OpenSSL Bignum?
- 如何有效地收集给定数组中的重复元素?
- 是否可以仅使用位操作有效地完成图像屏蔽
- opencv Qt如何有效地创建彩色图像并将其传递给QImage
- c++有效地在背景图像上绘制线条
- c++ /SIFT/SQL -如果有一种方法可以有效地比较图像的SIFT描述符与SQL数据库中的SIFT描述符
- 如何在图像处理中有效地使用线程
- 如何有效地循环图像在Qt