【发布时间】:2017-07-11 17:39:01
【问题描述】:
我想将两种颜色相乘,其分量为 byte,但结果不一致。
当组件是 float 时,它非常简单:
float a = 1.0f;
float b = 1.0f;
float c = a * b;
当组件是byte时,我依稀记得有一些位移,但是我的公式显然缺少一些东西:
byte a = 255;
byte b = 255;
byte c = (byte)((a * b) >> 8);
// 255 * 255 = 65025 then 65025 >> 8 = 254
// obviously, adding 1 to the result is just wrong
注意:
我不能使用 Forms 或 WPF 等流行框架中的 Color 类型,因为我的项目充当了一个抽象层,可以从不同的框架中重复使用。
问题:
使用位移来乘以byte 颜色的正确算法是什么?
【问题讨论】:
-
您总是可以将字节值标准化为浮点数,进行乘法运算,然后再转换回来:
float fA = (float)(a / 255.0); float fB = (float)(b / 255.0); float fC = fA * fB; byte c = (byte)(255 * fC);。 -
(byte)((a * b + 0xFF) >> 8)是你想要的结果吗? -
@itsme86 我知道有这个防故障解决方案,但是如果我可以避免使用浮点数,因为我正在做一堆转换,那就太好了。
-
@Aybe 你能给出所需输入/输出对的列表吗? 128*128 = 64 对我来说看起来很合理,因为 128 = 0.5。
标签: c# colors bit-shift multiplication