我试图根据图片获取应用的背景和前景色。 (就像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
我很想检查你的建议,以改善我的工作。至今。这是它的工作原理。
我很想看到你的想法。或任何可以帮助我的相关链接。