Начало простое: создайте прозрачное растровое изображение, выполнив 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
:
Несколько заметок:
Вы также можете использовать полупрозрачную кисть для создания «тонированного» отверстия; не используйте для этого сглаживание, так как это приведет к появлению цветных полос.
Мы использовали здесь простые круги, но с помощью GraphicsPath
вы можете создавать и заполнять фигуры практически любой формы и сложности.
И использование GraphicsPath
также было бы альтернативой заполнению прозрачностью: добавив сначала большого и затем меньшего внутреннего эллипса, путь будет было создано с отверстием , и заполнение его имело бы тот же самый результат! Но я нашел решение выше более поучительным ..
Заключительное примечание. Как отметил clarkitect, для сохранения используйте формат, поддерживающий прозрачность. Png
всегда рекомендуется ..