色を比較したいのですが、どこから始めればいいのかわかりません。私は試した
private static int CompareColors(Color colorA, Color colorB)
{
long resultA = colorA.A + colorA.B + colorA.G + colorA.R;
long resultB = colorB.A + colorB.B + colorB.G + colorB.R;
return (int)Math.Max(-1, Math.Min(1, resultA - resultB));
}
ただし、個別のチャネルの違いを考慮せずに合計の「色の値」を比較し、一種の暗から明のリストを作成するだけです。それで私は試しました
private static int CompareColors(Color colorA, Color colorB)
{
string resultA = colorA.Tostring();
string resultB = colorB.Tostring();
return string.Compare(resultA, resultB);
}
少し良い結果が得られるように見えますが、時々奇妙に場違いな明るい色が点在しています (特に「柔らかい」/「低い値」の色の領域)。(どのように)その最後の結果を改善できますか?
編集:すべてのコメントに感謝します。意味のある応答を生成するには、この質問にもう少し背景が必要な場合があることを理解しました。これが私の目標です。このようなカラー パレットを想像してください。これをソートされたリストで表現したいと思います。もちろん、カラー パレットは 2D で、私のリストは 1D ですが、このように検索する組み込みの色のみを使用しています。
List<Color> colors = new List<Color>();
Type colorType = typeof(Colors);
foreach (PropertyInfo propertyInfo in colorType.GetProperties(BindingFlags.Public | BindingFlags.Static))
{
if (propertyInfo.PropertyType == typeof(Color))
{
colors.Add((Color)propertyInfo.GetValue(null, null));
}
}
colors.Sort(new Comparison<Color>((colorA, colorB) => CompareColors(colorA, colorB)));
そして、これらの色を使用して、カラーパレットのような色の平等によって色がグループ化されたリストを作成しようとしています。明るさによる並べ替えは 2 番目ですが、色グループ間のスムーズな移行には依然として重要です。
わかりやすくするために、「色の均等性」と「色のグループ」を使用して、サンプル カラー パレットの視覚的に一貫した色の領域を参照しています。「スムーズなトランジション」とは、視覚的に一貫した色の領域の間にあるカラー パレットの領域を指しています。私はサンプル カラー パレット機能のような多種多様な色を扱っていません。組み込みの色 (かなりの量のクリームのような色が特徴のようです) のみを扱っています。