2010-12-09 16 views
5

मैं इस छवि के अंदर एक आयताकार कटौती करने और इसे एक अलग तस्वीर के रूप में सहेजने के लिए एक छवि को घुमाने के लिए एक रास्ता तलाश रहा हूं।WPF: छवि को काट और सहेजें

Illustration

संपादित करें: समाधान के लिए स्वीकार कर लिया उत्तर देखें।

उत्तर

4

अद्यतन
मैं फिर से अपने प्रश्न पढ़ सकते हैं और यह शायद आपकी समस्या के करीब है। मुझे आपके निर्देशांक का उपयोग करने के बारे में काफी जानकारी नहीं मिली है, लेकिन यह विधि बिटमैप इमेज लेगी, इसे कोण से घुमाएगी और इसकी एक फसल संस्करण को प्रारंभिक एक्स, वाई मानों से निर्दिष्ट चौड़ाई और ऊंचाई के साथ सहेज लेंगे। शायद आप 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); 
     } 
    } 

कोड ऊपर पूरी तरह से काम करता है। मैं आपकी सहायता के बिना इसे कभी पूरा नहीं कर सकता था।

संबंधित मुद्दे