VB - 将RGB字符串转换为“最近的”Colorname

时间:2018-06-18 16:42:27

标签: vb.net

我做了一个检测图像颜色的应用程序。 它输出颜色为RGB代码,用于实例R = 23,G = 44,B = 109

现在应将这些RGB代码转换为粗糙的颜色名称(“蓝色”,“白色”,“黄色”)等等,每个“看起来像”蓝色的颜色应简洁地定义为“蓝色”。

谢谢:)

2 个答案:

答案 0 :(得分:1)

以下是两个可能产生所需结果的类。没花太多时间,因为你没有提供太多的东西。

Public Class LooksLikeColor
    Private _color As Color
    Public Sub New(colorToTest As Color) 'i.e.colorToTest = Color.FromArgb(23, 44, 109)
        Me._color = colorToTest
    End Sub

    Public distList As New List(Of ColorDistance)
    Public minDist As Double
    Public maxDist As Double
    Public avgDist As Double

    Private Sub DistanceFromList(ColorList As IEnumerable(Of Color))
        Me.distList.Clear()
        For Each c As Color In ColorList
            Dim foo As New ColorDistance(c, Me._color)
            Me.distList.Add(foo)
        Next
        Me.distList = Me.distList.OrderBy(Function(d) d._distance).ToList

        Me.minDist = Me.distList.Min(Function(d) d._distance)
        Me.maxDist = Me.distList.Max(Function(d) d._distance)
        Me.avgDist = Me.distList.Average(Function(d) d._distance)
    End Sub

    Public Sub ComputeDistanceKnownColors()
        Me.DistanceFromList(From kc In [Enum].GetValues(GetType(System.Drawing.KnownColor)) Select Color.FromName(kc.ToString))
    End Sub

    Public Sub ComputeDistanceFromList(Optional ColorList As List(Of Color) = Nothing)
        If ColorList Is Nothing Then
            Dim clrs() As Color = {Color.Red, Color.Green, Color.Blue, Color.Yellow, Color.Cyan, Color.Magenta}
            Me.DistanceFromList(clrs)
        Else
            Me.DistanceFromList(ColorList)
        End If
    End Sub

    Public Function SelDist(dist As Double) As List(Of ColorDistance)
        Dim rv As New List(Of ColorDistance)
        rv = (From d In Me.distList Where d._distance <= dist Select d).ToList
        Return rv
    End Function
End Class

Public Class ColorDistance
    ''' <summary>
    ''' known color
    ''' </summary>
    ''' <remarks></remarks>
    Public _r1 As Color
    Public _r2 As Color
    Public _distance As Double = 0.0R

    Public Sub New(knwn As Color, tstColor As Color)
        Me._r1 = knwn
        Me._r2 = tstColor
        Me._distance = ((CInt(Me._r2.R) - CInt(Me._r1.R)) ^ 2)
        Me._distance += ((CInt(Me._r2.G) - CInt(Me._r1.G)) ^ 2)
        Me._distance += ((CInt(Me._r2.B) - CInt(Me._r1.B)) ^ 2)
        Me._distance = Math.Sqrt(Me._distance)
    End Sub
End Class

和一些用

进行测试的代码
    Dim c As Color = Color.FromArgb(23, 44, 109)
    Dim foo As New LooksLikeColor(c)
    foo.ComputeDistanceFromList()

    Dim cdl As List(Of ColorDistance) = foo.SelDist(foo.avgDist)
    Debug.WriteLine("")
    For Each d As ColorDistance In cdl
        Debug.WriteLine(d._r1.Name)
    Next

使用调试器来遵循代码。根据需要进行调整。

答案 1 :(得分:0)

最简单的方法是定义颜色的地图(蓝色,白色,黄色),将标签与特定的RGB值相关联,然后您可以使用color distances

之一的mertics

您可以采用欧氏距离,然后计算最接近的颜色,使该指标最小化。显然,这不会有完美的结果,但可以为你所接受。