/// <summary> /// 处理捕捉到的窗口区域位图,获取当前最佳匹配方法 /// </summary> /// <param name="bitmap">捕捉到的位图</param> public Solution GetSolution(Bitmap bitmap) { float factor = (float)(bitmap.Width - 8) / (float)1024; m_jewel_width = (int)Math.Round(factor * JEWEL_WIDTH); m_jewel_height = m_jewel_width; m_board_left_real = (int)Math.Round(factor * (m_board_left_ref - 4)) + 4; m_board_top_real = bitmap.Height - ((int)Math.Round(factor * (802 - m_board_top_ref - 4)) + 4); JewelColor[,] jewels = new JewelColor[ROW_COUNT, COL_COUNT]; int a_min = (int)Math.Round(m_jewel_width * 0.366); int a_max = (int)Math.Round(m_jewel_width * 0.610); for (int i = 0; i < ROW_COUNT; i++) { int y = m_board_top_real + (m_jewel_height * i); for (int j = 0; j < COL_COUNT; j++) { int x = m_board_left_real + (m_jewel_width * j); int color_r = 0; int color_g = 0; int color_b = 0; int color_count = 0; for (int a = a_min; a < a_max; a++) { for (int b = a_min; b < a_max; b++) { Color pixel = bitmap.GetPixel(x + a, y + b); color_r += pixel.R; color_g += pixel.G; color_b += pixel.B; color_count++; } } color_r = color_r / color_count; color_g = color_g / color_count; color_b = color_b / color_count; if (Math.Abs(((float)color_g / (float)color_r) - 1) < 0.15 && Math.Abs(((float)color_b / (float)color_r) - 1) < 0.15) { color_g = color_r; color_b = color_r; } Color color_avg = Color.FromArgb(color_r, color_g, color_b); int hue = (int)color_avg.GetHue(); int sat = (int)(color_avg.GetSaturation() * 1000); jewels[i, j] = GetColorFromHueSat(hue, sat); } } return(ProcessAllJewels(jewels)); }
/// <summary> /// 获取指定颜色宝石的分布情况数据 /// </summary> /// <param name="jewels">以宝石颜色为项目的二维数组</param> /// <param name="color">指定的宝石颜色</param> /// <returns>指定颜色宝石分布情况的二维数组</returns> private int[,] GetSpecColorJewels(JewelColor[,] jewels, JewelColor color) { int[,] result = new int[ROW_COUNT, ROW_COUNT]; for (int i = 0; i < ROW_COUNT; i++) { for (int j = 0; j < COL_COUNT; j++) { result[i, j] = (jewels[i, j] == color) ? 1 : 0; } } return(result); }
/// <summary> /// 获取宝石颜色 /// </summary> /// <param name="hue">色相值</param> /// <param name="sat">饱和度值</param> /// <returns>宝石颜色</returns> private JewelColor GetColorFromHueSat(int hue, int sat) { JewelColor jewel_color = JewelColor.White; if (sat < 180) { jewel_color = JewelColor.White; } else if (hue > ((HUE_RED + HUE_PURPLE) / 2)) { jewel_color = JewelColor.Red; } else if (hue > ((HUE_PURPLE + HUE_BLUE) / 2)) { jewel_color = JewelColor.Purple; } else if (hue > ((HUE_BLUE + HUE_GREEN) / 2)) { jewel_color = JewelColor.Blue; } else if (hue > ((HUE_GREEN + HUE_YELLOW) / 2)) { jewel_color = JewelColor.Green; } else if (hue > ((HUE_YELLOW + HUE_ORANGE) / 2)) { jewel_color = JewelColor.Yellow; } else if (hue > ((HUE_ORANGE + HUE_WHITE) / 2)) { jewel_color = JewelColor.Orange; } else { jewel_color = JewelColor.White; } return(jewel_color); }