2013-03-29 25 views
6

System.Drawing.Bitmap biçiminde bir resim ve 4 nokta biçiminde bir dikdörtgen (PointF s önemsiz olarak dönüştürülen Vector2 s).Döndürülmüş bir dikdörtgen ile görüntü nasıl kırpılır?

Görüntünün bir bölümünü kesmek için bu noktaları kullanmak istiyorum. Ne istediğime oldukça yakın olan this answer'u buldum, ama doğru matrisi nasıl çıkaracağımı bilmiyorum. İşte

Bugüne kadar bu var:

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

nasıl rect'in dışarı doğru dönüşümü matrisi alabilirim?

cevap

1

O bağlantılı cevap aynı olurdu, ama yerine:

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

Sen kullanırsınız.

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

(Ya da o çizgisinde bir şey Bu -angle olabilir veya rect[1] yerine rect[0] ve tersi Atan2. Hemen kontrol edemiyorum…)

+0

Oldukça benzer bir şey buldum, ama biraz kapalı. – mpen

1

Figured out:

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; 
} 
İlgili konular