从(切孔到)图像中反转裁剪
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 画笔填充它们即可。
无论我在哪里上网,我都会看到人们发布有关如何成功裁剪图像的帖子。但是,我想 '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 画笔填充它们即可。