C# 如何从WinForm pictureBox中的图像裁剪多边形区域?

C# 如何从WinForm pictureBox中的图像裁剪多边形区域?,c#,image,winforms,crop,C#,Image,Winforms,Crop,如何裁剪带有多边形的图像的一部分?例如,我有6个坐标,我想剪切图像的这一部分 您可以将点的列表制作成多边形,然后制作成图形,然后制作成区域和图形之后。剪辑(区域)您可以制作图形。DrawImage并完成 using System.Drawing.Drawing2D; GraphicsPath gp = new GraphicsPath(); // a Graphicspath gp.AddPolygon(points.ToArray()); // with one Polyg

如何裁剪带有多边形的图像的一部分?例如,我有6个坐标,我想剪切图像的这一部分


您可以将
点的
列表
制作成多边形,然后制作成
图形,然后制作成
区域
图形之后。剪辑(区域)
您可以制作
图形。DrawImage
并完成

using System.Drawing.Drawing2D;

GraphicsPath gp = new GraphicsPath();   // a Graphicspath
gp.AddPolygon(points.ToArray());        // with one Polygon

Bitmap bmp1 = new Bitmap(555,555);  // ..some new Bitmap
                                    // and some old one..:
using (Bitmap bmp0 = (Bitmap)Bitmap.FromFile("D:\\test_xxx.png"))
using (Graphics G = Graphics.FromImage(bmp1))
{
    G.Clip = new Region(gp);   // restrict drawing region
    G.DrawImage(bmp0, 0, 0);   // draw clipped
    pictureBox1.Image = bmp1;  // show maybe in a PictureBox
}
gp.Dispose();  
请注意,您可以在任何位置自由选择
DrawImage
位置,包括原点左侧和顶部的负片区域

还要注意,对于“真实”裁剪,一些(至少4个)点应该命中目标
位图
的边框或者可以使用
GraphicsPath
获取其边界框:

RectangleF rect = gp.GetBounds();
Bitmap bmp1 = new Bitmap((int)Math.Round(rect.Width, 0), 
                         (int)Math.Round(rect.Height,0));
..

但矩形只有4条边。这不是一个问题吗?边界框不是用来裁剪的,而是用来确定目标位图大小的最小目标矩形。对于裁剪,需要使用graphicspath&clip。使用graphicspath的边界是一种方便的方法,而不是分析所有这些点。一开始不起作用-必须将剪辑坐标弄乱,使其以零为基础