【问题标题】:How to subtract two hex color in C#?如何在 C# 中减去两个十六进制颜色?
【发布时间】:2017-03-26 03:49:51
【问题描述】:

我想在 C# 中减去两个十六进制数。我该怎么做?

类似这样的: #7ffffff - #000123

【问题讨论】:

  • 你想要的结果是什么?将它们都视为 24 位整数并减去它们?结果是否定的怎么办?或者将它们视为单独减去的三个单独的数字?那些结果是否定的呢?
  • 我有一个矩阵,我想给它上色。因此,如果矩阵元素小于特定数字,则从 #7fffff 中减去颜色,如果大于则使用 #7fffff 添加颜色。@DangerZone
  • 我没有问你想做什么,我问的是你到目前为止已经尝试过什么来解决你的十六进制数相减问题。您对这个问题投了 2 票的原因很可能是因为您在解决这个问题方面没有付出任何努力。

标签: c# colors hex


【解决方案1】:

十六进制文字以0x 为前缀,如0x7fffff。因此,您可以将每个值分配给一个整数并减去它们:

int color1 = 0x7fffff;
int color2 = 0x000123;

int difference = color1 - color2;

诚然,这是一种幼稚的方法,在很多情况下都行不通,尽管鉴于您的评论,我认为这已经足够了。考虑一下如果从较小的颜色中减去具有较大属性的颜色会发生什么,如下所示:

0xFF20FF - 0x003000 = 0xFEE0FF

我认为你不想从红色借 1,将0xFF 添加到绿色。在这种情况下,我可能希望结果为0xFF00FF。在这种情况下,您可能需要一种方法来减去底为零的单个颜色元素,如下所示:

int SubtractColors( int color1, int color2 )
{
    int red = Math.Max( 0,( color1 >> 16 ) - ( color2 >> 16 ) );
    int green = Math.Max( 0, ( ( color1 >> 8 ) & 0xFF ) - ( ( color2 >> 8 ) & 0xFF ) );
    int blue = Math.Max( 0, ( color1 & 0xFF ) - ( color2 & 0xFF ) );

    return ( red << 16 ) + ( green << 8 ) + blue;
}

我们在这里做了一些“有点抨击”,很多经验不足的程序员并不熟悉。如果上面的代码不完全有意义,您可能想了解:

&gt;&gt; right shift operator

&lt;&lt; left shift operator

&amp; bitwise AND operator

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2016-12-27
    • 2014-04-09
    • 2019-06-16
    • 2021-03-08
    • 2020-05-12
    • 2019-10-29
    相关资源
    最近更新 更多