How to crop an image using a rotary rectangle?

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

I want to use these points to cut out part 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 from it.

Here is what I have so far:

 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 correct transform matrix from my rect?

+6
source share
2 answers

This will be the same as in the linked answer, but instead:

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

Would you use:

 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]); 

(Or something along these lines. It could be -angle or rect[0] instead of rect[1] and vice versa in Atan2 . I can’t check right away ...)

+1
source

It revealed:

 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; } 
+1
source

All Articles