【问题标题】:RGB to Decimal vb.netRGB 转十进制 vb.net
【发布时间】:2015-08-10 02:13:27
【问题描述】:

我用谷歌搜索了一段时间,试图找到一个可以将 RGB 输入更改为十进制的 vb.net 函数。我知道有 convert.Int32 路线,但需要 Hex -> decimal。

【问题讨论】:

  • 如果你想发布一个自我回答的问题,应该有一个可接受格式的实际问题。否则有些人可能会对此进行DV。
  • 你很久没有Google了。

标签: vb.net hex decimal rgb


【解决方案1】:

如果您想避免来自 Microsoft.VisualBasic 的方法(例如,您希望能够轻松地将其转换为 C#),您可以比您建议的答案更有效地做到这一点:

Function RGBtoInteger(r As Integer, g As Integer, b As Integer) As Integer
    If r > 255 OrElse g > 255 OrElse b > 255 OrElse r < 0 OrElse g < 0 OrElse b < 0 Then
        Throw New ArgumentException("Parameters must be in the range 0..255.")
    End If
    Return (b << 16) + (g << 8) + r
End Function

【讨论】:

  • @Plutonix 哦,天哪,如果它给出了错误的答案,那根本不是很有效。固定,并按照通常的方式将 rgb 更改为 bgr,以防有人实际使用该代码,尽管 OP 似乎想要 rgb。
  • 路人注意:(b &lt;&lt; 16) + (g &lt;&lt; 8) + r模仿VB的Information.RGB的回归;而 (r &lt;&lt; 16) + (g &lt;&lt; 8) + b 将相当于 OP 的版本。任你选。 (+1)
  • 感谢 Plutonix 和 Andrew 提供的网站礼仪提示和更高效的功能。我以前从未使用过位移运算符,因此必须阅读
  • @CalfordMath (0, 32, 1) 将是 #002001。用数字表示 RGB 的常用方法是使蓝色具有最高值,因此它将是 #012000,即与您使用的相反的方式。如果还有 alpha 通道,就写成 ARGB,A 占据最高字节。
  • @CalfordMath I don't care about the down votes 但每个 DVd 问题都会让您更接近禁令或问题限制; DV 的问题在 Google 和搜索结果中的排名较低,因此答案将帮助更少的人;它更有可能被关闭和/或删除。如果它被删除,它现在可能会更困扰莫顿先生,因为他将失去 20 个代表和 2 个刻度,以获得他的银色 VB 徽章。 DV 很重要。
【解决方案2】:

这是我创建的函数,希望它有用吗(我知道我通过从 10 到 16 的转换重新发明了轮子……但这很有趣。我是一个数学极客):

Public Function RGBtoDecimal(red As Integer, green As Integer, blue As Integer) As Long
    Dim dec As Long = 0
    Dim n, r As Integer
    'write each colour as base 16

    'blue first, starting with smallest power of 16 right to left
    n = blue
    Dim j As Integer = 0
    For i As Integer = 0 To 1
        r = CInt(Math.Round(16 * ((n / 16) - Int(n / 16))))
        n = CInt(Int(n / 16))
        dec = CLng(dec + (r * (16 ^ j)))
        j += 1
    Next

    'green
    n = green
    For i As Integer = 0 To 1
        r = CInt(Math.Round(16 * ((n / 16) - Int(n / 16))))
        n = CInt(Int(n / 16))
        dec = CLng(dec + (r * (16 ^ j)))
        j += 1
    Next

    'red
    n = red
    For i As Integer = 0 To 1
        r = CInt(Math.Round(16 * ((n / 16) - Int(n / 16))))
        n = CInt(Int(n / 16))
        dec = CLng(dec + (r * (16 ^ j)))
        j += 1
    Next
    Return dec
End Function

【讨论】:

  • 这不能与 Option Strict On 一起编译。当您在此处发布代码时,预计它会;)
  • 我添加了一些 CInt、CLng 来让 Strict 开心。它不像“
猜你喜欢
  • 2021-03-22
  • 1970-01-01
  • 2020-11-14
  • 2015-10-12
  • 2012-10-08
  • 2013-03-19
相关资源
最近更新 更多