private void ClusteringMethod(object parameter) { data.Image = data.OriginalImage; List <EachPixel> pixels = new List <EachPixel>(); //Коллекция пикселей string PatternMatches = @"\d+"; // Создаем шаблон для координат точек Regex rg = new Regex(PatternMatches); foreach (var line in File.ReadLines(PixelsPath.FileName)) // { MatchCollection matchedline = rg.Matches(line); // Получаем все совпадения слов и символов pixels.Add(new EachPixel()); pixels[pixels.Count - 1].x = Convert.ToInt32(matchedline[0].Value); pixels[pixels.Count - 1].y = Convert.ToInt32(matchedline[1].Value); } Collection <EachCluster> clusters = data.clustering(pixels, data.MaxDistance); //Кластеризация точек Bitmap newImage = converter.BitmapImage2Bitmap(data.Image); //Конвертация Изображения в Bitmap для работы Random rnd = new Random(); foreach (EachCluster cluster in clusters) //Обработка каждого кластера { Color randomColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256)); //рандомный цвет каждого кластера for (int i = 0; i < cluster.neighbours.Count; i++) //Каждый пиксель в кластере покрасить в один цвет { newImage.SetPixel(cluster.neighbours[i].x, cluster.neighbours[i].y, randomColor); } Model.Icon model = new Model.Icon(); using (Graphics grf = Graphics.FromImage(newImage)) //Рисование Иконки для кластера { //Смещение иконки на 16 (Размер Иконки 32) для оцентровки grf.DrawIcon(model.CustomIcon(Convert.ToString(cluster.neighbours.Count)), cluster.x - 16, cluster.y - 16); } data.Image = converter.Bitmap2BitmapImage(newImage); OnPropertyChange(); } }
/// <summary> /// Scales an image to given dimensions, preserving aspect ratio /// </summary> /// <param name="icon">Subject icon</param> /// <param name="width">Desired width</param> /// <param name="height">Desired height</param> /// <returns>System.Drawing.Image</returns> public static Image ScaleImage(Model.Icon icon, int width, int height) { var adjustX = (double)width / icon.Image.Width; var adjustY = (double)height / icon.Image.Height; var ratio = Math.Min(adjustX, adjustY); var newWidth = (int)(icon.Image.Width * ratio) - icon.Padding; var newHeight = (int)(icon.Image.Height * ratio) - icon.Padding; var newImage = new Bitmap(newWidth, newHeight); using (var graphics = Graphics.FromImage(newImage)) graphics.DrawImage(icon.Image, 0, 0, newWidth, newHeight); return(newImage); }