2010-12-09 27 views
5

Je cherche un moyen de faire pivoter une image afin de couper un rectangle à l'intérieur de cette image et de l'enregistrer comme une image distincte.WPF: Couper et enregistrer l'image

Illustration

Edit: Voir réponse acceptée pour la solution.

Répondre

4

Mise à jour
Je lis à nouveau votre question, ce qui est probablement plus proche de votre problème. Je n'ai pas tout à fait compris comment utiliser vos coordonnées, mais cette méthode prendra un BitmapImage, le fera pivoter d'un angle et sauvegardera une version recadrée à partir des valeurs X, Y de départ avec la largeur et la hauteur spécifiées. Probablement pas 100% comme ce que vous essayez de faire mais j'espère que vous pouvez utiliser l'idée.

public void RotateAndSaveImage(BitmapImage sourceImage, 
           double angle, 
           int startX, 
           int startY, 
           int width, 
           int height, 
           string filePath) 
{ 
    TransformGroup transformGroup = new TransformGroup(); 
    RotateTransform rotateTransform = new RotateTransform(angle); 
    rotateTransform.CenterX = sourceImage.PixelWidth/2.0; 
    rotateTransform.CenterY = sourceImage.PixelHeight/2.0; 
    transformGroup.Children.Add(rotateTransform); 
    TranslateTransform translateTransform = new TranslateTransform(); 
    translateTransform.X = -startX; 
    translateTransform.Y = -startY; 
    transformGroup.Children.Add(translateTransform); 

    DrawingVisual vis = new DrawingVisual(); 
    DrawingContext cont = vis.RenderOpen(); 
    cont.PushTransform(transformGroup); 
    cont.DrawImage(sourceImage, new Rect(new Size(sourceImage.PixelWidth, sourceImage.PixelHeight))); 
    cont.Close(); 

    RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Default); 
    rtb.Render(vis); 

    FileStream stream = new FileStream(filePath, FileMode.Create); 
    PngBitmapEncoder encoder = new PngBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(rtb)); 
    encoder.Save(stream); 
    stream.Close(); 
} 

Nous vous remercions de votre poste, je devais modifier la fonction un peu:

private static double RadianToDegree(double angle) 
    { 
     return angle * (180.0/Math.PI); 
    } 

    public static double GetDistanceBetweenPoints(Point p, Point q) 
    { 
     var a = p.X - q.X; 
     var b = p.Y - q.Y; 
     return Math.Sqrt(a * a + b * b); 
    } 

    private static double CalculateTheta(Point p1, Point p2) 
    { 
     var deltaX = Math.Abs(p1.Y - p2.Y); 
     var deltaY = Math.Abs(p1.X - p2.X); 
     var theta = RadianToDegree(Math.Atan(deltaY/deltaX)); 
     return (90 - theta) * -1; 
    } 

    public void RotateAndSaveImage(string sourceFile, List<Point> subCoords) 
    { 
     var bitmap = new BitmapImage(); 
     bitmap.BeginInit(); 
     bitmap.UriSource = new Uri(sourceFile); 
     bitmap.EndInit(); 

     var p1 = subCoords[0]; 
     var p2 = subCoords[1]; 
     var p4 = subCoords[3]; 

     var theta = CalculateTheta(p1, p2); 
     var width = GetDistanceBetweenPoints(p1, p2); 
     var height = GetDistanceBetweenPoints(p1, p4); 

     var transformGroup = new TransformGroup(); 
     var rotateTransform = new RotateTransform(theta) 
     { 
      CenterX = p1.X, 
      CenterY = p1.Y 
     }; 
     transformGroup.Children.Add(rotateTransform); 

     var translateTransform = new TranslateTransform 
     { 
      X = -p1.X, 
      Y = -p1.Y 
     }; 

     transformGroup.Children.Add(translateTransform); 

     var vis = new DrawingVisual(); 

     using (var cont = vis.RenderOpen()) 
     { 
      cont.PushTransform(transformGroup); 
      cont.DrawImage(bitmap, new Rect(
       new Size(bitmap.PixelWidth, bitmap.PixelHeight))); 
     } 

     var rtb = new RenderTargetBitmap((int)width, (int)height, 
      96d, 96d, PixelFormats.Default); 
     rtb.Render(vis); 

     using (var stream = new FileStream(TargetFile, FileMode.Create)) 
     { 
      var encoder = new JpegBitmapEncoder(); 
      encoder.Frames.Add(BitmapFrame.Create(rtb)); 
      encoder.Save(stream); 
     } 
    } 

Le code ci-dessus fonctionne parfaitement. Je n'aurais jamais accompli cela sans votre aide.