7

a の形の画像System.Drawing.Bitmapと 4 つの点の形の四角形がVector2あります (自明に s に変換されるPointFs )。

これらのポイントを使用して、画像の一部を切り抜きたいと考えています。私が望むものにかなり近いこの答えを見つけましたが、そこから正しいマトリックスを取得する方法がわかりません。

ここに私がこれまでに持っているものがあります:

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

rect から適切な変換行列を取得するにはどうすればよいですか?

4

2 に答える 2

1

理解した:

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;
}
于 2013-03-29T21:53:15.340 に答える
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ます。すぐには確認できません…)

于 2013-03-29T20:47:11.307 に答える