winforms 如何在c#中裁剪多边形图像

khbbv19g  于 2023-02-09  发布在  C#
关注(0)|答案(2)|浏览(180)

我在做标签工具。
目标:通过在图片上绘制多边形,您必须导出图像 从多边形内部到外部。
示例

提取

这是我在程序里画的。

但是我不知道怎么提取这个区域,我想知道怎么提取这个区域,我已经把上面图片的顶点保存在一个对象中,但是我不知道怎么通过这些顶点从图像中提取数据

所以我找到了这个https://www.codeproject.com/Articles/703519/Cropping-Particular-Region-In-Image-Using-Csharp
但这不是工作
Can't convert Bitmap to IplImage
同样的原因,我在帖子里说要用opencvsharp 4.x,但是我现在修复的程序是. netframework 3.5,所以不支持opencvsharp 4.x,怎么办?

我做了一个函数来引用答案,但是它不起作用......我想知道为什么。

void CropImage(Bitmap bitmap, Point[] points)
        {
            Rectangle rect = PaddingImage(points, bitmap);
            TextureBrush textureBrush = new TextureBrush(bitmap);
            Bitmap bmp1 = new Bitmap(rect.Width, rect.Height);
            using (Graphics g = Graphics.FromImage(bmp1))
            {
                g.FillPolygon(textureBrush, points);
            }

            string ima_path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

            bmp1.Save(ima_path + "\\Image.png", ImageFormat.Png);
        }

提取图像

原始的

如果使用小多边形,则根本没有输出。

您会注意到这两个图像略有不同。
在我看来,切割和提取中心点的部分不一样,我不知道我的想法是否正确。

new9mtju

new9mtju1#

您将创建一个新位图,至少与多边形的边框一样大。从此新位图创建Create a graphics对象。然后,您可以将原始图像用作a texture brush,将draw the polygon应用于此位图。请注意,您可能需要应用转换矩阵,以便从完整图像坐标转换为裁剪图像坐标。
请注意,它看起来像是放射图像。这些图像通常是16位的,因此在使用之前需要转换为8位单色或24位RGB。如果您可以访问源代码,则应在绘图代码中完成此操作。或者you can do it yourself

d6kp6zgx

d6kp6zgx2#

这对我有用

private Bitmap CropImage(Bitmap bitmap, List<Point> points)
    {
        int pminx = 9999, pminy = 9999, pmaxx = 0, pmaxy = 0; System.Drawing.Point[] pcol = new System.Drawing.Point[points.Count]; int i = 0;
        foreach (Point pc in points)
        {
            if (pc.X > pmaxx) pmaxx = (int)pc.X;
            if (pc.Y > pmaxy) pmaxy = (int)pc.Y;
            if (pc.X < pminx) pminx = (int)pc.X;
            if (pc.Y < pminy) pminy = (int)pc.Y;

            pcol[i] = new System.Drawing.Point((int)pc.X, (int)pc.Y);
            i++;
        }
        
        TextureBrush textureBrush = new TextureBrush(bitmap);
        Bitmap bmpWrk = new Bitmap(bitmap.Width, bitmap.Height);

        using (Graphics g = Graphics.FromImage(bmpWrk))
        {
            g.FillPolygon(textureBrush, pcol);
        }

        System.Drawing.Rectangle CropRect = new System.Drawing.Rectangle(pminx, pminy, pmaxx - pminx, pmaxy - pminy);

        return bmpWrk.Clone(CropRect, bmpWrk.PixelFormat);
    }

相关问题