从(切孔到)图像中反转裁剪

Invert Crop from (Cut hole into) Image

无论我在哪里上网,我都会看到人们发布有关如何成功裁剪图像的帖子。但是,我想 'crop'/ 清除图像中的一个洞。我想保留原始图像,但裁剪出一个矩形

如上图所示,我 "cropped" 画出了小猫的脸。我保留了原始图像,但只删除了一部分。我不知道该怎么做。

假设您想用透明度替换原始像素颜色,您 运行 遇到了一个小问题:您无法在 GDI+ 中使用透明度 绘制或填充。

但是你可以使用Graphics.Clear(Color.Transparent)

为此,您限制 Graphics 对象将绘制的区域。这里我们可以使用简单的裁剪矩形,但您可以使用 GraphicsPath..

清除更复杂的形状

使用位图的示例 bmp:

using (Graphics g = Graphics.FromImage(bmp))
{
    Rectangle crop = new Rectangle(222,222,55,55);
    g.SetClip(crop);
    g.Clear(Color.Transparent);
}
bmp.Save(somefilename, ImageFormat.Png);

将您的 Graphics 对象的 CompositingMode 属性 设置为 CompositingMode.SourceCopy 将允许您的绘图操作替换 alpha 值而不是按比例使其不透明:

        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);
            }
        }

在这段代码中,我先画了一个fully-opaque红色方块,然后画了一个semi-transparent红色方块"over"它。结果是方块中的一个semi-transparent"hole":

在黑色背景上:

A zero-opacity 画笔效果也一样,在图像上留下了一个清晰的洞(我检查过)。 考虑到这一点,您应该能够裁剪任何您想要的形状,只需用 zero-opacity 画笔填充它们即可。