如何裁剪带有旋转矩形的图像?

Posted

技术标签:

【中文标题】如何裁剪带有旋转矩形的图像?【英文标题】:How to crop an image with a rotated rectangle? 【发布时间】:2013-03-29 20:41:20 【问题描述】:

我有一个 System.Drawing.Bitmap 形式的图像和一个 4 点形式的矩形(Vector2s 可以简单地转换为 PointFs)。

我想使用这些点来裁剪图像的一部分。我发现this answer 非常接近我想要的,但我不确定如何从中得到正确的矩阵。

这是我目前所得到的:

protected static Bitmap CropImage(Bitmap src, Vector2[] rect)

    var width = (rect[1] - rect[0]).Length;
    var height = (rect[3] - rect[0]).Length;
    var result = new Bitmap(M2.Round(width), M2.Round(height));
    using (Graphics g = Graphics.FromImage(result))
    
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        using (Matrix mat = new Matrix())
        
             // ????
        
    
    return result;

如何从我的矩形中得到正确的变换矩阵?

【问题讨论】:

【参考方案1】:

这将与链接答案中的相同,但不是:

mat.Translate(-rect.Location.X, -rect.Location.Y);
mat.RotateAt(angle, rect.Location);

你会使用:

double angle = Math.Atan2(rect[1].Y - rect[0].Y, rect[1].X - rect[0].X);
mat.Translate(-rect[0].X, -rect[0].Y);
mat.RotateAt((float)angle, rect[0]);

(或者类似的东西。可能是-angle,或者rect[0]而不是rect[1],反之亦然Atan2。我不能立即检查......)

【讨论】:

我想出了一些非常相似的东西,但有点不对劲。【参考方案2】:

想通了:

protected static Bitmap CropImage(Bitmap src, Vector2[] rect)

    var width = (rect[1] - rect[0]).Length;
    var height = (rect[3] - rect[0]).Length;
    var result = new Bitmap(M2.Round(width), M2.Round(height));
    using (Graphics g = Graphics.FromImage(result))
    
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        using (Matrix mat = new Matrix())
        
            var rot = -Math.Atan2(rect[1].Y - rect[0].Y, rect[1].X - rect[0].X) * M2.RadToDeg;

            mat.Translate(-rect[0].X, -rect[0].Y);
            mat.RotateAt((float)rot, rect[0].ToPointF());

            g.Transform = mat;
            g.DrawImage(src, new Rectangle(0, 0, src.Width, src.Height));
        
    
    return result;

【讨论】:

以上是关于如何裁剪带有旋转矩形的图像?的主要内容,如果未能解决你的问题,请参考以下文章

从 WPF 中的图像裁剪对角线区域

将 UIScrollview 中显示的图像裁剪为覆盖层中显示的矩形

裁剪区域不是矩形时裁剪图像

如何从图像中检测和裁剪对象?

从图像中裁剪 System.Windows.Shapes 矩形

裁剪 UIImage 使其在保存时逆时针旋转 90º