这是关于从像素值中提取 RGB。这是代码片段:
Byte a = (Byte)(myColor >> 24);
// Prevent division by zero
UInt32 ai = a;
if (ai == 0)
{
ai = 1;
}
ai = ((255 << 8) / ai);
Byte bA = a;
Byte bR = (Byte)((((myColor >> 16) & 0xFF) * ai) >> 8);
Byte bG = (Byte)((((myColor >> 8) & 0xFF) * ai) >> 8);
Byte bB = (Byte)((((myColor & 0xFF) * ai) >> 8));
我从技术上理解,即在位和二进制级别上发生了什么。我特别了解 'Byte b# = (Byte)((((myColor >> n) & 0xFF)' 部分。我不明白的是预乘法(我的意思是这里的实现,而不是理论)。特别是我想了解 - 所以我的问题:
- 为什么 255 向右移动 8 位然后除以 alpha?
- 为什么每个值都乘以这个结果,然后向左移动 8 位?