2013-03-29 9 views
6

Mam obraz w postaci System.Drawing.Bitmap i prostokąt w postaci 4 punktów (Vector2 s, które są trywialnie konwertowane na PointF s).Jak przyciąć obraz za pomocą obróconego prostokąta?

Chcę użyć tych punktów, aby wykadrować część obrazu. Znalazłem this answer, który jest bardzo zbliżony do tego, co chcę, ale nie jestem pewien, jak uzyskać odpowiednią matrycę z niego.

Oto co mam do tej pory:

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

Jak mogę uzyskać odpowiednią macierz transformacji z moim rect?

Odpowiedz

1

To będzie taka sama jak w połączonej odpowiedzi, ale zamiast:

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

byłoby użyć.

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

(albo coś w tym kierunku może być -angle lub rect[0] zamiast rect[1] i vice versa w Atan2. Nie mogę od razu sprawdzić ...)

+0

Wymyśliłem coś bardzo podobnego, ale jest trochę za późno. – mpen

1

Wyliczyłem:

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; 
} 
Powiązane problemy