如何裁剪图像与旋转矩形?矩形、图像

2023-09-03 16:42:05 作者:不想翻身的咸鱼

我有一个 System.Drawing.Bitmap ,并在4个点(的形成矩形 Vector2 ■哪些被轻易地转化成的PointF S)。

I have an image in the form of a System.Drawing.Bitmap and a rectangle in the form of 4 points (Vector2s which are trivially converted to PointFs).

我想用这些点裁剪出的图像的部分。我发现这个答案是pretty的接近我想要的,但我不知道怎么弄的正确的矩阵出来。

I want to use those points to crop out a section of the image. I found this answer which is pretty close to what I want, but I'm not sure how to get the right matrix out of it.

下面是我有这么远:

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;
}

我怎样才能得到适当的变换矩阵我的矩形的?

How can I get the proper transform matrix out of my rect?

推荐答案

想通了:

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;
}
 
精彩推荐
图片推荐