2013-03-29 6 views
6

मेरे पास System.Drawing.Bitmap के रूप में एक छवि है और 4 अंक (Vector2 एस के रूप में एक आयताकार है जिसे त्रिकोणीय रूप से 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; 
} 

मैं अपने रेक्ट से बाहर उचित मैट्रिक्स को बदलने मिल सकता है?

उत्तर

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; 
} 
संबंधित मुद्दे