【问题标题】:C# crop image trapezoid / polygon [duplicate]C#裁剪图像梯形/多边形[重复]
【发布时间】:2021-08-06 19:13:42
【问题描述】:

我有一张图片,我想从一张图片中剪下一个梯形。

我有 8 个像这样的不同坐标(8 个值形成一个具有 4 个点的多边形)

pointA(222,222)
pointB(666,234)
pointC(678,235)
pointD(210,220)

我只知道如何像这样使用bitmap.Clone 裁剪图像

var x = pointA.x;
var y = pointA.y;
var height = pointD.y - pointA.y;
var width = pointB.x - pointA.x;
Bitmap image = new Bitmap(imagepath);
var rect = new Rectangle(x, y, wight, height);
var newImage = image.Clone(rect, image.PixelFormat);

这将创建一个直矩形,而我要剪切的子部分的重要部分正在消失。

那么,如何在控制台环境下使用 c# 和 .net framework core 裁剪出梯形?

我想剪出一个梯形,但我只是想出了一个更好的形式来描述我想要的是一个多边形。

【问题讨论】:

    标签: c# image crop


    【解决方案1】:

    一种方法是使用Graphics API。这有一个FillPolygon 方法,它采用点列表和画笔。要使用源位图,您可以使用TextureBrush。把这些放在一起,你会得到这样的结果:

        public Bitmap FillPolygon(Bitmap sourceBitmap, PointF[] polygonPoints)
        {
            var targetBitmap = new Bitmap(256, 256);
            using var g = Graphics.FromImage(targetBitmap);
            using var brush = new TextureBrush(sourceBitmap);
            g.FillPolygon(brush, polygonPoints);
            return targetBitmap;
        }
    

    我认为这应该在 Windows 控制台上工作。历史上,在没有 Windows 会话的情况下使用某些图形 API 会出现一些问题,但我认为这不再是问题了。

    为了获得最大的兼容性,您始终可以自己对梯形进行三角测量和rasterize 并复制选定的像素,但这可能需要更多的工作。

    【讨论】:

    • 感谢您的回答 - 在我发现“梯形”也是一个多边形之后,我编辑了我的问题并尝试实现这个答案 - stackoverflow.com/questions/30954503/… 但我只得到黑色图像跨度>
    • @derbjörn 检查目标位图是否足够大,并尝试使用例如Brushes.White 进行绘图以检查绘图是否有效。并且有些对象需要放置在正确的位置才能正常工作。
    • 目标位图足够大,我尝试了一些解决方案。但我需要多做一些修改来归档我的解决方案。同时(再次感谢 Graphis-API 的这个提示)我想出了如何在图像上绘制 - 而不是“刷”出区域,我可以使用“笔”在图像上绘制一个多边形 - 这个有效 - 但即使有你的提示,所有“透明”或“黑色”图像(分辨率“正确”但图片中没有任何内容)
    • 我只得到黑色图像 请出示您现在使用的代码! - 8 个不同点 这是什么意思???? 4(!) 点的形状更像三角形而不是梯形... - 另外:源位图有多大?
    • 感谢@JonasH ,我能够创建一个解决方案
    猜你喜欢
    • 1970-01-01
    • 2013-04-04
    • 2014-08-03
    • 2017-10-28
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多