以下のコードは、.NET のSystem.Drawing.BitmapクラスとSystem.Drawing.Colorクラスに依存していますが、これらはどちらも MonoTouch でサポートされていると思います (少なくともMono Documentationを読んだ限りでは)。
したがって、bmpという名前のSystem.Drawing.Bitmapオブジェクトに画像があるとします。次のようなコードを使用して、その画像の平均色相を取得できます。
float hue = 0;
int w = bmp.Width;
int h = bmp.Height;
for (int y = 0; y < bmp.Height; y++) {
for (int x = 0; x < bmp.Width; x++) {
Color c = bmp.GetPixel(x, y);
hue += c.GetHue();
}
}
hue /= (bmp.Width*bmp.Height);
これは画像全体を繰り返し処理しているため、大きな画像の場合は非常に遅くなる可能性があります。パフォーマンスが問題になる場合は、評価されるピクセルを画像の小さなサブセクションに制限するか ( juhan_hで提案されているように)、小さな画像を使用して開始することをお勧めします。
次に、0 から 360 度の範囲にある平均色相を指定すると、次のようにその数値を色名にマッピングできます。
String[] hueNames = new String[] {
"red","orange","yellow","green","cyan","blue","purple","pink"
};
float[] hueValues = new float[] {
18, 54, 72, 150, 204, 264, 294, 336
};
String hueName = hueNames[0];
for (int i = 0; i < hueNames.Length; i++) {
if (hue < hueValues[i]) {
hueName = hueNames[i];
break;
}
}
hueValuesテーブルとhueNamesテーブルの値を推定したところなので、これらのテーブルを要件に合わせて調整することをお勧めします。値は、色が次の名前に変わるように見えるポイントです (たとえば、赤とオレンジの間の境界線は約 18 度で発生します)。
色相値によって表される色の範囲を把握するには、下のカラー ホイールを見てください。上から始めて、赤/オレンジ (約 0° - 北) から黄色/緑 (約 90° - 東)、シアン (約 180° - 南)、青/紫 (約 270° - 西) になります。 .
ただし、彩度と明るさのレベルを無視しているため、この計算の結果は、色あせた色や暗い場所では理想的とは言えません。ただし、壁の全体的な色だけに関心がある場合は、それで十分だと思います。