Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何正确地将两种颜色与字节分量相乘?_C#_Colors_Bit Shift_Multiplication - Fatal编程技术网

C# 如何正确地将两种颜色与字节分量相乘?

C# 如何正确地将两种颜色与字节分量相乘?,c#,colors,bit-shift,multiplication,C#,Colors,Bit Shift,Multiplication,我想将两种颜色相乘,它们的分量是byte,但结果不一致 当组件处于浮动状态时非常精确且简单: float a = 1.0f; float b = 1.0f; float c = a * b; 当组件是字节时,我模糊地记得有一些位移位,但我的公式显然遗漏了一些东西: byte a = 255; byte b = 255; byte c = (byte)((a * b) >> 8); // 255 * 255 = 65025 then 65025 >> 8 = 254 //

我想将两种颜色相乘,它们的分量是
byte
,但结果不一致

当组件处于浮动状态时非常精确且简单:

float a = 1.0f;
float b = 1.0f;
float c = a * b;
当组件是
字节时,我模糊地记得有一些位移位,但我的公式显然遗漏了一些东西:

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
注意:

我不能使用流行框架(如表单或WPF)中的
颜色
类型,因为我的项目充当了一个抽象层,可以从不同的框架中重复使用

问题:

使用位移位将
字节
颜色相乘的正确算法是什么?

的评论对我很有用:

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

我将他的评论转载为一个答案,以使他的解决方案更容易找到。

您可以将字节值标准化为浮点,进行乘法,然后再转换回:
float fA=(float)(a/255.0);浮动fB=(浮动)(b/255.0);浮点数fC=fA*fB;字节c=(字节)(255*fC)
.Is
(byte)((a*b+0xFF)>>8)
你想要的结果吗?@itsme86我知道有这种防故障的解决方案,但是如果我可以避免使用浮点数,因为我正在进行一系列转换,那就太好了。@Aybe你能给出一个所需输入/输出对的列表吗?128*128=64在我看来非常合理,因为128=0.5。我发现知道该做什么非常有用。-而且要做转换