如何正确地将两种颜色与字节分量相乘?
How to correctly multiply two colors with byte components?
我想将成分为 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
颜色的正确算法是什么?
Harold 的评论对我有用:
(byte)((a * b + 0xFF) >> 8)
我正在重新发布他的评论作为答案,以便更容易找到他的解决方案。
我想将成分为 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
颜色的正确算法是什么?
Harold 的评论对我有用:
(byte)((a * b + 0xFF) >> 8)
我正在重新发布他的评论作为答案,以便更容易找到他的解决方案。