0

我正在研究一些项目,我开始了 ColorPicker 项目。我无法理解 LongToRgb 函数 >>> 如下:

**

Private Function LongToRGB(lColor As Long) As String
    Dim iRed As Long, iGreen As Long, iBlue As Long
    iRed = lColor Mod 256
    iGreen = ((lColor And &HFF00) / 256&) Mod 256&
    iBlue = (lColor And &HFF0000) / 65536
    LongToRGB = Format$(iRed, "000") & ", " & Format$(iGreen, "000") & ", " & Format$(iBlue, "000")
End Function

**

我希望有人用简单的英语向我解释...

4

2 回答 2

3

Mod Operator (% in C#)

基本上,它返回除法运算的剩余部分。例如,13 Mod 4 = 1,因为 13 / 4 = 3 w/余数为 1。了解 long 值是如何创建的,以了解函数为什么会这样做,这一点很重要。


所有颜色(红色、绿色、蓝色)都以 0-255 的数量表示。例如,想象以下值:R(8)、G(3)、B(1)。

要了解该函数为什么会这样做,让我们看一下数值范围为 0-9(10 个值)而不是 0-255(256 个值)的场景。您将如何表示可以对这些值进行逆向工程的单个值?您不能简单地将这些值相加 (8 + 3 + 1 = 12),因为不可能对原始值进行逆向工程。相反,您必须将值乘以基数。基数取决于值范围...在示例中为 10,因为有 10 个值。该位置是从零开始的索引。红色的位置是 0,绿色的位置是 1,蓝色的位置是 2。

  • Value * (Base^Position))
  • 红色(8) = (8 * 10^0) = 8 * 1 = 8
  • 绿色(3) = (3 * 10^1) = 3 * 10 = 30
  • 蓝色(1) = (1 * 10^2) = 1 * 100 = 100

8 + 30 + 100 = 138。而且 138 可以很容易地被逆向工程(事实上,只要看看它!)。数学上的逆向工程是这样完成的:

  • (CombinedValue / (Base^Position)) % Base = OriginalValue.
  • (138 / (10^0)) % 10 = (138 / 1) % 10 = 138 % 10 = 8 (红色)
  • (138 / (10^1)) % 10 = (138 / 10) % 10 = 13 (小数被截断) % 10 = 3 (绿色)
  • (138 / (10^2)) % 10 = (138 / 100) %10 = 1(小数被截断)% 10 = 1(蓝色)

该函数做了几件事:

  • 由于某种原因(lColor And &HFF00),它无用地执行按位运算符。(lColor And &HFF0000)
  • 它简化了数学。红色 (256^0 = 1) 除以 1 没有意义,使用模运算符检索绿色也没有意义,因为 X % 256 = X 对于 X < 256 的所有 X。此外,256^2等于 65536。
  • 它使用可以表示颜色值的实际范围(0-255、256 个值)。

您实际上可以使用该函数的简化版本:

Private Function LongToRGB(lColor As Long) As String
    Dim iRed As Long, iGreen As Long, iBlue As Long

    iRed = lColor Mod 256
    iGreen = (lColor / 256) Mod 256
    iBlue = lColor / 65536

    LongToRGB = Format$(iRed, "000") & ", " & Format$(iGreen, "000") & ", " & Format$(iBlue, "000")
End Function

请注意,最后一种方法只是一个字符串格式化函数,与数学无关。

于 2012-04-10T18:56:24.353 回答
3

Mod是模运算,通常也称为模运算%

它取两个值之间的整数除法的余数。在您的情况下,从包含所有组件的 long 中获取组件颜色(红色、绿色、蓝色)的有意义部分很有用。

例如:

1234 Mod 100 = 34
于 2012-04-10T17:23:02.363 回答