无论我在网上看到什么,我都会看到人们发布如何成功裁剪图像。但是,我想从图像中“裁剪”/清除一个洞。我想保留原始图像,但裁剪出一个矩形
正如你在上面的图片中看到的那样,我已经“裁剪”出了小猫脸。我保留了原始图像,但只删除了部分图像。我无法弄清楚如何做到这一点。
假设您想要用透明度替换原始像素颜色,则会遇到一个小问题:您无法在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);
}
}
在这段代码中,我首先绘制一个完全不透明的红色正方形,然后是一个半透明的红色正方形。结果在广场上有一个半透明的“洞”:
零不透明画笔也可以正常工作,在图像上留下一个清晰的洞(我检查过)。考虑到这一点,您应该能够裁剪所需的任何形状,只需使用零不透明度刷子填充它们即可。