0

色を比較したいのですが、どこから始めればいいのかわかりません。私は試した

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 番目ですが、色グループ間のスムーズな移行には依然として重要です。

わかりやすくするために、「色の均等性」と「色のグループ」を使用して、サンプル カラー パレットの視覚的に一貫した色の領域を参照しています。「スムーズなトランジション」とは、視覚的に一貫した色の領域の間にあるカラー パレットの領域を指しています。私はサンプル カラー パレット機能のような多種多様な色を扱っていません。組み込みの色 (かなりの量のクリームのような色が特徴のようです) のみを扱っています。

4

1 に答える 1

3

任意の並べ替えが必要な場合は、任意の方法で実装できます。例えば:

private static int CompareColors(Color colorA, Color colorB)
{
  if (colorA.A > colorB.A)
    return 1;
  if (colorA.A < colorB.A)
    return -1;

  if (colorA.R > colorB.R)
    return 1;
  if (colorA.R < colorB.R)
    return -1;

  if (colorA.G > colorB.G)
    return 1;
  if (colorA.G < colorB.G)
    return -1;

  if (colorA.B > colorB.B)
    return 1;
  if (colorA.B < colorB.B)
    return -1;

  return 0;
}
于 2011-10-31T16:39:13.860 に答える