Установка для Graphics
свойства *1001* объекта CompositingMode.SourceCopy
позволит вашим операциям рисования заменить альфа-значение, а не пропорционально его помечать:
public static void TestDrawTransparent()
{
//This code will, successfully, draw something transparent overwriting an opaque area.
//More precisely, it creates a 100*100 fully-opaque red square with a 50*50 semi-transparent center.
using(Bitmap bmp = new Bitmap(100, 100, PixelFormat.Format32bppArgb))
{
using(Graphics g = Graphics.FromImage(bmp))
using(Brush opaqueRedBrush = new SolidBrush(Color.FromArgb(255, 255, 0, 0)))
using(Brush semiRedBrush = new SolidBrush(Color.FromArgb(128, 255, 0, 0)))
{
g.Clear(Color.Transparent);
Rectangle bigRect = new Rectangle(0, 0, 100, 100);
Rectangle smallRect = new Rectangle(25, 25, 50, 50);
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
g.FillRectangle(opaqueRedBrush, bigRect);
g.FillRectangle(semiRedBrush, smallRect);
}
bmp.Save(@"C:\FilePath\TestDrawTransparent.png", ImageFormat.Png);
}
}
В этом коде я сначала рисуюполностью непрозрачный красный квадрат, затем полупрозрачный красный квадрат "над" ним.В результате получается полупрозрачная «дыра» в квадрате:
И на черном фоне:
Кисть с нулевой непрозрачностью работает так же хорошо, оставляя чистую дыру в изображении (я проверил).Помня об этом, вы сможете обрезать любые фигуры, просто заполнив их кистью с нулевой непрозрачностью.