Как удалить часть изображения в C#

В этом примере вы можете удалить часть изображения. Он позволяет загружать файл изображения, а затем щелкнуть и перетащить, чтобы выбрать область на изображении. Когда вы отпускаете мышь, программа генерирует два новых изображения: изображение, содержащее только выбранную область, и изображение с выбранной областью. Другие части обоих изображений прозрачны. Затем программа отображает два новых изображения, нарисованных поверх шаблона шахматной доски, чтобы вы могли видеть прозрачные области.

В следующем коде показан метод MakeImageWithArea, который создает изображение, содержащее только выбранную область.

// Создаем изображение, которое включает только выбранную область.
private Bitmap MakeImageWithArea(Bitmap source_bm,
    List points)
{
    // Скопируем изображение.
    Bitmap bm = new Bitmap(source_bm.Width, source_bm.Height);

    // Очистить выбранную область.
    using (Graphics gr = Graphics.FromImage(bm))
    {
        gr.Clear(Color.Transparent);

        // Создаем кисть, содержащую исходное изображение.
        using (Brush brush = new TextureBrush(source_bm))
        {
            // Заполните выделенную область.
            gr.FillPolygon(brush, points.ToArray());
        }
    }
    return bm;
}

Сначала метод создает новое растровое изображение, которое имеет те же размеры, что и исходное растровое изображение. Он создает объект Graphics, связанный с новым растровым изображением, и использует его для очистки растрового изображения, заполняя его прозрачным цветом.

Далее код создает TextureBrush. A TextureBrush заполняет объекты повторяющимся изображением. В этом случае программа использует исходное растровое изображение как образ кисти. Затем он просто заполняет выбранную область кистью. Затем метод возвращает новое растровое изображение.

Код, создающий изображение с выбранной удаленной областью, немного сложнее. В идеале вы просто начнете с копии оригинального растрового изображения, а затем заполните выбранную область прозрачным цветом. К сожалению, когда вы рисуете, программа накладывает новый цвет поверх существующих цветов изображения. Например, если вы рисуете с 50% непрозрачным цветом, рисованная область только затеняется частично непрозрачным цветом. В этом примере, если вы заполняете область прозрачным цветом, цвет фона отображается так, что область полностью не затронута.

Вы можете заполнить область необычным цветом, а затем использовать метод MakeTransparent растрового изображения, чтобы сделать пиксели с прозрачным цветом. Например, вы можете использовать пурпурный или цвет с компонентами RGB 1, 1, 1 и надеяться, что исходное изображение не содержит пикселов с этим цветом. Тем не менее, всегда есть шанс, что изображение будет содержать этот цвет, а затем программа сделает прозрачные прозрачные пиксели.

В этом примере используется другой подход, который показан в следующем коде.

// Создаем изображение, которое включает только выбранную область.
private Bitmap MakeImageWithoutArea(Bitmap source_bm,
    List points)
{
    // Скопируем изображение.
    Bitmap bm = new Bitmap(source_bm);

    // Очистить выбранную область.
    using (Graphics gr = Graphics.FromImage(bm))
    {
        GraphicsPath path = new GraphicsPath();
        path.AddPolygon(points.ToArray());
        gr.SetClip(path);
        gr.Clear(Color.Transparent);
        gr.ResetClip();
    }
    return bm;
}

Этот код создает копию исходного растрового изображения и создает связанный с ним объект Graphics. Затем он создает объект GraphicsPath и добавляет к нему точки выбранной области в виде многоугольника. Он вызывает метод Graphics объекта Graphics, чтобы ограничить операции рисования с помощью GraphicsPath, а затем использует Graphics объект Очистить, чтобы очистить растровое изображение с помощью Прозрачного цвета. Поскольку SetClip ограничивает рисование в выбранной области, это очищает только выбранную область.

После очистки выбранной области код сбрасывает область отсечения растрового изображения и возвращает растровое изображение.

В программе есть еще один интересный фрагмент кода. Метод MakeSampleImage, показанный в следующем коде, принимает растровое изображение в качестве параметра и рисует его поверх шаблона шахматной доски, чтобы вы могли видеть любые прозрачные области изображения.

// Сделайте образец, показывающий прозрачные области.
private Bitmap MakeSampleImage(Bitmap bitmap)
{
    const int box_wid = 20;
    const int box_hgt = 20;

    Bitmap bm = new Bitmap(bitmap.Width, bitmap.Height);
    using (Graphics gr = Graphics.FromImage(bm))
    {
        // Начнем с шаблона шахматной доски.
        gr.Clear(Color.White);
        int num_rows = bm.Height / box_hgt;
        int num_cols = bm.Width / box_wid;
        for (int row = 0; row < num_rows; row++)
        {
            int y = row * box_hgt;
            for (int col = 0; col < num_cols; col++)
            {
                int x = 2 * col * box_wid;
                if (row % 2 == 1) x += box_wid;
                gr.FillRectangle(Brushes.LightBlue,
                    x, y, box_wid, box_hgt);
            }
        }

        // Нарисуем изображение сверху.
        gr.DrawImageUnscaled(bitmap, 0, 0);
    }
    return bm;
}

Сначала метод создает растровое изображение с соответствующим размером и создает связанный объект Graphics. Он очищает растровое изображение белым цветом, а затем использует вложенные петли для рисования синего рисунка шахматной доски.

Затем метод использует метод Graphics объекта GraphicsImageUnscaled для рисования исходного изображения сверху и возвращает результат.

Источник: http://csharphelper.com/blog/2015/04/remove-part-of-an-image-in-c/

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