以编程方式检查颜色对比度C#

时间:2015-10-29 05:54:44

标签: c# wpf vb.net

我试图根据图片获取应用的背景和前景色。 (就像iTunes使用歌曲专辑封面的方式一样)但我在获得完美的色彩组合方面遇到了问题,在某些情况下,我得到的两种颜色太霓虹或太亮而不是背景,而两种颜色几乎是相同颜色的不是我想要实现的目标。

如果有人知道iTunes算法是如何工作的,那将是完美的。

截至目前。这是我使用的代码,但它并不完美。

Dim Image As FileStream = New FileStream(Path.Combine(dir, "GetColor.jpg"), FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

            Using bmp = New Bitmap(Image)
                For x = 2 To bmp.Width - 2
                    For y = 2 To bmp.Height - 2
                        If colorList.ContainsKey(bmp.GetPixel(x, y)) Then colorList(bmp.GetPixel(x, y)) += 1 Else colorList.Add(bmp.GetPixel(x, y), 1)
                    Next
                Next
                bmp.Dispose()
            End Using
            Image.Close() : Image.Dispose()

            Dim colors = colorList.OrderByDescending(Function(x) x.Value)
            accent(0) = colors(0).Key : accent(1) = Nothing

            For Each a In colors
                Dim z() As Integer = {a.Key.R, a.Key.G, a.Key.B}
                If Math.Abs(z(0) - accent(0).R) > 100 Xor Math.Abs(z(1) - accent(0).G) > 100 Xor Math.Abs(z(2) - accent(0).B) > 100 Then
                    Select Case accent(0).GetBrightness < 0.5
                        Case True
                            If Math.Abs(a.Key.GetBrightness - accent(0).GetBrightness) > 0.25 Then
                                If a.Key.GetBrightness > 0.25 Then
                                    accent(1) = a.Key
                                    Exit For
                                End If
                            End If
                        Case False
                            If a.Key.GetBrightness < accent(0).GetBrightness Then
                                If accent(0).GetBrightness < 0.75 AndAlso a.Key.GetBrightness < 0.45 Or a.Key.GetBrightness < 0.5 AndAlso Math.Abs(a.Key.GetBrightness - accent(0).GetBrightness) > 0.4 AndAlso a.Key.GetSaturation < 0.75 Then
                                    accent(1) = a.Key
                                    Exit For
                                End If
                            End If
                    End Select
                End If
            Next
            If accent(1) = Nothing Then
                Select Case accent(0).GetBrightness < 0.35
                    Case True : accent(1) = Color.White
                    Case False : accent(1) = Color.FromArgb(255, accent(0).R * 0.075, accent(0).G * 0.075, accent(0).B * 0.075)
                End Select
            End If
            If accent(0).GetBrightness > accent(1).GetBrightness Then
                accent(2) = accent(0) : accent(0) = accent(1) : accent(1) = accent(2)
            End If
            accent(2) = accent(0) : accent(3) = accent(0)
            colorList = Nothing
            colors = Nothing
        End If

我很想检查你的建议,以改善我的工作。至今。这是它的工作原理。

  • 首先我将图像调整为30x30
  • 然后我得到所有像素的颜色并按计数排序。
  • 我自动使用主色作为第一种颜色。
  • 然后在这部分。我不知道自己在做什么,但在大多数情况下它都能完美运作。
  • 然后比较两种颜色的亮度,如果color1比color2亮,则切换它们
  • 在这部分,如果我没有找到第二种颜色,这正是我的问题,为什么我找不到第二种颜色。我使用黑色或白色取决于GetBrightness功能。

我很想看到你的想法。或任何可以帮助我的相关链接。

0 个答案:

没有答案