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

问题描述 投票:0回答:1

无论我在网上看到什么,我都会看到人们发布如何成功裁剪图像。但是,我想从图像中“裁剪”/清除一个洞。我想保留原始图像,但裁剪出一个矩形

enter image description here

正如你在上面的图片中看到的那样,我已经“裁剪”出了小猫脸。我保留了原始图像,但只删除了部分图像。我无法弄清楚如何做到这一点。

c# image bitmap crop
1个回答
4
投票

假设您想要用透明度替换原始像素颜色,则会遇到一个小问题:您无法在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);

1
投票

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

在这段代码中,我首先绘制一个完全不透明的红色正方形,然后是一个半透明的红色正方形。结果在广场上有一个半透明的“洞”:

Red square with semi-transparent center在黑色背景上:The square with semi-transparent hole, on a black background

零不透明画笔也可以正常工作,在图像上留下一个清晰的洞(我检查过)。考虑到这一点,您应该能够裁剪所需的任何形状,只需使用零不透明度刷子填充它们即可。

© www.soinside.com 2019 - 2024. All rights reserved.