2010-12-09 71 views
5

我正在尋找一種方法來旋轉圖像,以便在此圖像內切出一個矩形並將其保存爲單獨的圖片。WPF:剪切並保存圖像

Illustration

編輯:見接受的答案的解決方案。

回答

4

更新
我再次看了你的問題,這可能是更接近你的問題。我沒有完全弄清楚如何使用座標,但是這個方法將採用一個BitmapImage,將它旋轉一個角度,並從指定寬度和高度的起始X,Y值中保存它的裁剪版本。可能不是你想要做的100%,但希望你可以使用這個想法。

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

謝謝你的帖子,我不得不改變功能的位:

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

上面的代碼完美的作品。沒有你的幫助,我就永遠不會做到這一點。