2013-03-29 2 views
6

나는 System.Drawing.Bitmap 형태의 이미지와 4 포인트 (Vector2s는 보통 PointF 초로 변환 됨)의 형태로 된 이미지를 가지고 있습니다.회전 된 사각형으로 이미지를 자르는 방법은 무엇입니까?

해당 지점을 사용하여 이미지의 일부분을 잘라 내고 싶습니다. 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; 
} 

은 어떻게 RECT에서 적절한 변환 행렬을 얻을 수 있나요?

답변

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 인 경우 즉시 확인할 수 없음 ...)

+0

나는 아주 비슷한 것을 만들었지 만 조금 벗어났습니다. – mpen

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; 
} 
관련 문제