2013-03-29 59 views
6

Tôi có một hình ảnh ở dạng System.Drawing.Bitmap và hình chữ nhật ở dạng 4 điểm (Vector2 s được chuyển đổi trivially thành PointF s).Làm thế nào để cắt một hình ảnh với một hình chữ nhật xoay?

Tôi muốn sử dụng các điểm đó để cắt ra một phần của hình ảnh. Tôi tìm thấy this answer mà là khá gần với những gì tôi muốn, nhưng tôi không chắc chắn làm thế nào để có được ma trận bên phải ra khỏi nó.

Đây là những gì tôi đã có cho đến nay:

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

Làm thế nào tôi có thể nhận được các biến đổi ma trận thích hợp ra khỏi rect của tôi?

Trả lời

1

Nó sẽ giống như trong câu trả lời liên quan, nhưng thay vì:

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

Bạn sẽ sử dụng:.

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

(Hoặc một cái gì đó dọc theo những đường Nó có thể là -angle, hoặc rect[0] thay vì rect[1] và ngược lại trong Atan2. Tôi không thể kiểm tra ngay lập tức ...)

+0

Tôi đã nghĩ ra một thứ khá giống, nhưng nó hơi lệch. – mpen

1

Đã tìm ra:

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; 
} 
Các vấn đề liên quan