Пиксельные части изображения в C#
Эта программа позволяет щелкнуть и перетащить, чтобы выбрать область и пикселировать область.
Код, который позволяет вам выбрать область, интересен, но достаточно прост. См. Код и пример Используйте поле резиновой ленты, чтобы пользователь мог выбрать область на снимке в C# для получения дополнительной информации о выборе областей. Код, который загружает и сохраняет изображения, также прост.
В следующем коде показана наиболее интересная часть программы: метод, который пикселирует область изображения.
// Пикселируйте указанный прямоугольник. private void PixellateRectangle(Rectangle rect) { // Ограничьте прямоугольник, чтобы он поместился на изображении. int bm_wid = CurrentBitmap.Width; int bm_hgt = CurrentBitmap.Height; rect = Rectangle.Intersect(rect, new Rectangle(0, 0, bm_wid, bm_hgt)); // Обработать прямоугольник. const int box_wid = 8; using (Graphics gr = Graphics.FromImage(CurrentBitmap)) { int start_y = box_wid * (int)(rect.Top / box_wid); int start_x = box_wid * (int)(rect.Left / box_wid); for (int y = start_y; y <= rect.Bottom; y += box_wid) { for (int x = start_x; x <= rect.Right; x += box_wid) { // Область пикселя в верхнем левом углу (x, y). // Получаем средние значения цветов пикселей. int total_r = 0, total_g = 0, total_b = 0, num_pixels = 0; for (int dy = 0; dy < box_wid; dy++) { if (y + dy >= bm_hgt) break; for (int dx = 0; dx < box_wid; dx++) { if (x + dx >= bm_wid) break; Color pixel_color = CurrentBitmap.GetPixel(x + dx, y + dy); total_r += pixel_color.R; total_g += pixel_color.G; total_b += pixel_color.B; num_pixels++; } } byte r = (byte)(total_r / num_pixels); byte g = (byte)(total_g / num_pixels); byte b = (byte)(total_b / num_pixels); Color new_color = Color.FromArgb(255, r, g, b); // Дайте всем пикселам в поле этот цвет. using (Brush br = new SolidBrush(new_color)) { gr.FillRectangle(br, x, y, box_wid, box_wid); } } } / picImage.Image = CurrentBitmap; picImage.Refresh(); } }
Этот метод сначала пересекает выбранный прямоугольник с границами изображения. Если пользователь перетаскивает и затем отбрасывает мышь с края изображения, прямоугольник будет содержать точки от изображения, и нет смысла пытаться их обработать.
Далее код устанавливает константу box_wid в 8. Это размер пиксельных ячеек. Вы можете изменить это значение, чтобы сделать поля больше или меньше.
Переменная уровня CurrentBitmap содержит текущее изображение. Это исходное изображение, загруженное из файла с некоторыми областями, возможно, уже пиксельными. Программа создает объект Graphics, связанный с этим изображением, для рисования на нем.
Далее программа вычисляет координаты X и Y в изображении, где она начнет пикетирование. Он делит координаты целевого прямоугольника на box_wid, использует (int) для усечения результата, а затем умножает его на box_wid. Это делает стартовые X и Y координаты наибольшего кратного box_wid меньше или равного верхнему левому углу целевого прямоугольника. Код делает это, поэтому пиксели разных прямоугольников будут красиво выстраиваться. Если вы нажмете и перетащите на пиксель две области на изображении, и эти области перекрываются, их пиксельные ячейки будут выстраиваться в линию.
Затем код перебирает пиксели в целевом прямоугольнике. Для каждой области box_wid & times; box_wid код объединяет все цветовые компоненты пикселей и делит на количество пикселей внутри поля, чтобы получить среднее значение цвета. Затем код заполняет поле средним цветом.