Удалить круглую прозрачную часть изображения c # - PullRequest
0 голосов
/ 09 сентября 2018

Я создаю круг на растровом изображении, но хочу, чтобы в нем была дыра. После полчаса поиска я нашел только способы обрезать изображение в круг. Сложность в том, что отверстие в середине должно быть прозрачным, как и остальная часть изображения.

Это является базовым изображением, а желтый круг представляет прозрачную область, которая должна быть добавлена.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 09 сентября 2018

Начало простое: создайте прозрачное растровое изображение, выполнив g.Clear(Color.Transparent), а затем нарисуйте / залейте круг цветом.

Следующий шаг немного сложнее: вы хотите закрасить дыру прозрачностью.

Для этого вам нужно переключить графический объект вправо CompositingMode; по умолчанию SourceOver, но вы хотите SourceCopy. Прежний перекрывает альфа-значения, создавая смешанные цвета. Последний будет делать то, что мы хотим: нарисуйте дыру, скопировав нарисованные цвета включая альфа прямо поверх старых ..

Вот пример:

Bitmap bmp = new Bitmap(500, 500);
using (Graphics g = Graphics.FromImage(bmp))
{
    g.Clear(Color.Transparent);
    //g.SmoothingMode = SmoothingMode.AntiAlias;
    g.CompositingMode = CompositingMode.SourceCopy;
    g.FillEllipse(Brushes.DarkGreen, 100, 100, 300, 300);
    g.FillEllipse(Brushes.Transparent, 200, 200, 100, 100);
}
pictureBox1.Image = bmp;

Вот как выглядит PictureBox с BackgroundImage:

enter image description here

Несколько заметок:

  • Вы также можете использовать полупрозрачную кисть для создания «тонированного» отверстия; не используйте для этого сглаживание, так как это приведет к появлению цветных полос.

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

  • И использование GraphicsPath также было бы альтернативой заполнению прозрачностью: добавив сначала большого и затем меньшего внутреннего эллипса, путь будет было создано с отверстием , и заполнение его имело бы тот же самый результат! Но я нашел решение выше более поучительным ..

  • Заключительное примечание. Как отметил clarkitect, для сохранения используйте формат, поддерживающий прозрачность. Png всегда рекомендуется ..

...