Как рисовать с заменой вместо смешивания

Я пытаюсь «нарисовать» области прозрачности на растровом изображении - например, вырезать дыры в изображении.

Следующий код не рисует линию прозрачности, потому что рисование прозрачной линии на растровом изображении, конечно же, смешивает, а не заменяет. (Почему по умолчанию выполняется более сложная из двух операций рисования, не имеет смысла.)

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


person AppFzx    schedule 22.02.2013    source источник
comment
возможный дубликат Рисовать фигуру только в альфа-канал   -  person asawyer    schedule 23.02.2013
comment
Здесь 5 часов. Посмотрю любые ответы и приму в понедельник. Вопрос не мертв!   -  person AppFzx    schedule 23.02.2013


Ответы (1)


Это отлично работает для меня

Bitmap bmp = new Bitmap(50, 50, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
using (Graphics g = Graphics.FromImage(bmp))
{
    g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
    g.FillRectangle(Brushes.Black, 0, 0, 50, 50);
    g.FillEllipse(Brushes.Transparent, 25, 0, 25, 25);
    g.DrawLine(Pens.Transparent, 0, 0, 50, 50);
    g.Flush();
}
bmp.Save("Test.bmp");
person FlyingStreudel    schedule 22.02.2013
comment
Это то, с чем я сейчас играю, тестируя, но это не работает. - person AppFzx; 23.02.2013
comment
Допускает ли ваше растровое изображение прозрачность? Возможно, вы захотите установить формат, как в моем редактировании. - person FlyingStreudel; 23.02.2013
comment
Я на самом деле использую Format32bppPargb - person AppFzx; 23.02.2013
comment
Это не решает реальную проблему (проиллюстрировано тем, что я добавил, говоря, что пробовал использовать предложенный дубликат), но на самом деле он решает вопрос именно так, как я его задал. Отличная работа! - person AppFzx; 27.02.2013
comment
@AppFzx Этот ответ показывает примененное решение. CompositingMode.SourceCopy здесь ваш друг, а потом вроде создайте ручку с alpha = 0: new Pen(Color.FromArgb(0, 255, 255, 255), 3) - person Bitterblue; 26.07.2016