Я нашел это довольно интересным и углубился в него немного глубже.
Код для получения среднего цвета растрового изображения, найденный в Как рассчитать средние значения цвета rgb растрового изображения были проблемы, такие как недопустимые приведения и замена каналов на красный / синий.Вот исправленная версия:
private System.Drawing.Color CalculateAverageColor(Bitmap bm)
{
int width = bm.Width;
int height = bm.Height;
int red = 0;
int green = 0;
int blue = 0;
int minDiversion = 15; // drop pixels that do not differ by at least minDiversion between color values (white, gray or black)
int dropped = 0; // keep track of dropped pixels
long[] totals = new long[] { 0, 0, 0 };
int bppModifier = bm.PixelFormat == System.Drawing.Imaging.PixelFormat.Format24bppRgb ? 3 : 4; // cutting corners, will fail on anything else but 32 and 24 bit images
BitmapData srcData = bm.LockBits(new System.Drawing.Rectangle(0, 0, bm.Width, bm.Height), ImageLockMode.ReadOnly, bm.PixelFormat);
int stride = srcData.Stride;
IntPtr Scan0 = srcData.Scan0;
unsafe
{
byte* p = (byte*)(void*)Scan0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
int idx = (y * stride) + x * bppModifier;
red = p[idx + 2];
green = p[idx + 1];
blue = p[idx];
if (Math.Abs(red - green) > minDiversion || Math.Abs(red - blue) > minDiversion || Math.Abs(green - blue) > minDiversion)
{
totals[2] += red;
totals[1] += green;
totals[0] += blue;
}
else
{
dropped++;
}
}
}
}
int count = width * height - dropped;
int avgR = (int)(totals[2] / count);
int avgG = (int)(totals[1] / count);
int avgB = (int)(totals[0] / count);
return System.Drawing.Color.FromArgb(avgR, avgG, avgB);
}
Запуск этой функции на ваших входных изображениях, однако, возвратил некоторый неразличимый сероватый цвет для них обоих, как уже ожидалось Уиллом А в комментариях, поэтому яm отбрасывает любые цвета из расчета, которые не имеют разницы не менее 15 между R, G и B.
Интересно то, что предположительно синее сканирование по рецепту усредняет равные значения для G и B ( R: 214, G: 237, B: 237 ).Однако сканирование по зеленому рецепту привело к большой разнице (18) между значениями G и B ( R: 202, G: 232, B: 214 ), так что это может бытьВы должны смотреть в.Пример:
if (color.G - color.B > 15) { form.Type = FormTypes.GreenForm }