Пиксельные части изображения в 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 код объединяет все цветовые компоненты пикселей и делит на количество пикселей внутри поля, чтобы получить среднее значение цвета. Затем код заполняет поле средним цветом.

Источник: http://csharphelper.com/blog/2015/07/pixellate-parts-of-an-image-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector