【问题标题】:How to correctly multiply two colors with byte components?如何正确地将两种颜色与字节分量相乘?
【发布时间】: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。
  • 我发现this post 对知道该做什么很有帮助。 - 并做转移see here

标签: c# colors bit-shift multiplication


【解决方案1】:

Harold 的评论对我有用:

(byte)((a * b + 0xFF) >> 8)

我重新发布他的评论作为答案,以便更容易找到他的解决方案。

【讨论】:

    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多