GDI C# 在倾斜图像后删除背景
GDI C# Remove Background After Skewing Image
我正在尝试从输入的方形图像制作具有透明背景的倾斜图像。
到目前为止倾斜部分工作正常,但未倾斜图像的背景仍然存在。如何从背景中删除未倾斜的图像并将其替换为透明背景?
到目前为止我已经尝试使用 .Clear(Color.Transparent)
但它似乎只能使整个图像清晰或什么都不做。
到目前为止的代码:
using System;
using System.Drawing;
class Program
{
static void Main(string[] args)
{
Point[] destinationPoints = {
new Point (150, 20),
new Point (40, 50),
new Point (150, 300)
};
Image before = Image.FromFile(System.IO.Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
"before.png"));
var gr = Graphics.FromImage(before);
//drawing an ellipse
Pen myPen = new Pen(Color.Red);
gr.DrawEllipse(myPen, new Rectangle(0, 0, 200, 300));
//applying skewed points
gr.DrawImage(before, destinationPoints);
var path = System.IO.Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
"after.png");
before.Save(path);
}
}
before.png
after.png
粗略的预期结果
I've tried using Graphics.Clear(Color.Transparent)
but it only seems
to clear the entire image
确实;你需要 select 到你想先清除的部分,这是 除了 你绘制的部分倾斜..:
using System.Drawing.Drawing2D;
..
GraphicsPath gp = new GraphicsPath();
gp.AddRectangle(new Rectangle(Point.Empty, before.Size));
gp.AddPolygon(destinationPoints);
这首先 select 整个图像,然后在倾斜的目标区域切一个洞。
(注意:GraphicsPath 只允许您 添加 它包含的数字;默认缠绕模式的规则是:除非区域与已经重叠的区域重叠在那里。重叠的部分一旦被减去等等。)
现在您有两个选项可以清除图像未倾斜的部分。
您可以填充透明:
gr.CompositingMode = CompositingMode.SourceOver;
gr.FillPath(Brushes.Transparent, gp);
或者你可以清除 和透明:
gr.SetClip(gp);
gr.Clear(Color.Transparent);
这应该适用于您的示例图像。
不幸的是,一旦您的图像在倾斜部分包含非不透明像素,这将不起作用。此处原始像素仍会发光。
因此这种情况的解决方案相当简单:不要在原始位图上绘制,而是创建一个新位图,并使用您想要的背景色绘制到新位图上:
Image after = new Bitmap(before.Width, before.Height);
var gr = Graphics.FromImage(after );
gr.Clear(Color.yourChoice);
// now draw as needed..
我正在尝试从输入的方形图像制作具有透明背景的倾斜图像。
到目前为止倾斜部分工作正常,但未倾斜图像的背景仍然存在。如何从背景中删除未倾斜的图像并将其替换为透明背景?
到目前为止我已经尝试使用 .Clear(Color.Transparent)
但它似乎只能使整个图像清晰或什么都不做。
到目前为止的代码:
using System;
using System.Drawing;
class Program
{
static void Main(string[] args)
{
Point[] destinationPoints = {
new Point (150, 20),
new Point (40, 50),
new Point (150, 300)
};
Image before = Image.FromFile(System.IO.Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
"before.png"));
var gr = Graphics.FromImage(before);
//drawing an ellipse
Pen myPen = new Pen(Color.Red);
gr.DrawEllipse(myPen, new Rectangle(0, 0, 200, 300));
//applying skewed points
gr.DrawImage(before, destinationPoints);
var path = System.IO.Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
"after.png");
before.Save(path);
}
}
before.png
after.png
粗略的预期结果
I've tried using
Graphics.Clear(Color.Transparent)
but it only seems to clear the entire image
确实;你需要 select 到你想先清除的部分,这是 除了 你绘制的部分倾斜..:
using System.Drawing.Drawing2D;
..
GraphicsPath gp = new GraphicsPath();
gp.AddRectangle(new Rectangle(Point.Empty, before.Size));
gp.AddPolygon(destinationPoints);
这首先 select 整个图像,然后在倾斜的目标区域切一个洞。
(注意:GraphicsPath 只允许您 添加 它包含的数字;默认缠绕模式的规则是:除非区域与已经重叠的区域重叠在那里。重叠的部分一旦被减去等等。)
现在您有两个选项可以清除图像未倾斜的部分。
您可以填充透明:
gr.CompositingMode = CompositingMode.SourceOver;
gr.FillPath(Brushes.Transparent, gp);
或者你可以清除 和透明:
gr.SetClip(gp);
gr.Clear(Color.Transparent);
这应该适用于您的示例图像。
不幸的是,一旦您的图像在倾斜部分包含非不透明像素,这将不起作用。此处原始像素仍会发光。
因此这种情况的解决方案相当简单:不要在原始位图上绘制,而是创建一个新位图,并使用您想要的背景色绘制到新位图上:
Image after = new Bitmap(before.Width, before.Height);
var gr = Graphics.FromImage(after );
gr.Clear(Color.yourChoice);
// now draw as needed..