Я пытаюсь «нарисовать» области прозрачности на растровом изображении - например, вырезать дыры в изображении.
Следующий код не рисует линию прозрачности, потому что рисование прозрачной линии на растровом изображении, конечно же, смешивает, а не заменяет. (Почему по умолчанию выполняется более сложная из двух операций рисования, не имеет смысла.)
Bitmap myBitmap = new Bitmap(50, 50);
Graphics g = Graphics.FromImage(myBitmap);
g.FillRectangle(Brushes.Black, 0, 0, 50, 50);
g.FillEllipse(Brushes.Transparent, 25, 0, 25, 25); //Does nothing
g.DrawLine(Pens.Transparent, 0, 0, 50, 50); //Does nothing
Как мне изменить это, чтобы прозрачный круг и линия заменяли то, что в растровом изображении, а не смешивались?
(Обратите внимание, что это тривиальный случай «рисования» полной прозрачности. Конечная цель, к которой я собираюсь, - это возможность «рисовать», изменяя только альфа-канал, без создания собственного пикселя за пиксельной операцией. Возможность делать полную прозрачность позволит хотя хватит.)
После ответа в статье, предложенной как дубликат, я также пробовал следующее (что не работает)
base.OnPaint(e);
Bitmap myBitmap = new Bitmap(50, 50);
e.Graphics.FillRectangle(Brushes.Black, 0, 0, 50, 50);
Graphics g = Graphics.FromImage(myBitmap);
g.FillEllipse(new SolidBrush(Color.FromArgb(150, 125, 125, 125)), 25, 0, 25, 25);
g.DrawLine(new Pen(Color.FromArgb(150,25,25,25)), 0, 0, 50, 50);
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
e.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
e.Graphics.DrawImage(myBitmap, 0, 0);
также проверил это с SourceCopy