这是关于从像素值中提取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));
我从技术上理解,即在比特级别,以及二进制是什么。我特别理解'字节b#=(字节)((((myColor&gt;&gt; n)&amp; 0xFF)'部分。我不理解的是预乘(我的意思是这里的实现,而不是理论)。特别是我想了解 - 以及我的问题:
答案 0 :(得分:1)
这样做是为了在使用整数除法时提高精度。使用整数运算的原因可能是速度。
If MyColor = 0xAABBCCDD
AA = 170
BB = 187
CC = 204
DD = 221
Expected values:
bA = 170
bR = 187 * (255 / 170) = 280.5
bG = 204 * (255 / 170) = 306
bB = 221 * (255 / 170) = 331.5
with integer division 255/170, 255/204, 255/221 will all evaluate to 1 and premultiplication becomes ineffective.
By using this operation ai = ((255 << 8) / ai)
with integer division: ai = (255*256)/170 = 384
and subsequent multiplications and shifts gives you a more accurate result.
E.g.
bR = 187 * 384 / 256 = 280
bG = 204 * 384 / 256 = 306
bB = 221 * 384 / 256 = 331
话虽如此,我不相信这是alpha预乘的好方法。
如果您有兴趣,可以阅读Fixed Point Arithmetic
了解更多信息