2016-08-19 2 views
1

Ich habe ein Problem mit Bild beschneiden. Wenn ich versuche, ein Bild mit einem Rechteck zu beschneiden, wird der Zuschneidebereich auf einen seltsamen Wert eingestellt. Hier ist XAML-Code:WPF Image Cropping

<Grid Name="GridImage"> 
     <Image Name="LoadedImage" SnapsToDevicePixels="True" RenderOptions.BitmapScalingMode="HighQuality"> 
     </Image> 
     <Canvas x:Name="ImageCanvas" ClipToBounds="True"> 
      <Rectangle x:Name="SelectionRectangle" Stroke="LightBlue" Fill="#220000FF" Visibility="Collapsed" /> 
     </Canvas> 
    </Grid> 

und hier, wie ich Ernte Bild:

  var imagePosition = LoadedImage.TransformToAncestor(GridImage).Transform(new Point(0, 0)); 
      Rect rect1 = new Rect(Math.Max(Canvas.GetLeft(SelectionRectangle) - imagePosition.X, 0), Math.Max(Canvas.GetTop(SelectionRectangle) - imagePosition.Y, 0), SelectionRectangle.Width, SelectionRectangle.Height); 
      var ratioX = LoadedImage.Source.Width/LoadedImage.ActualWidth; 
      var ratioY = LoadedImage.Source.Height/LoadedImage.ActualHeight; 


      Int32Rect rcFrom = new Int32Rect 
      { 
       X = (int)(rect1.X * ratioX), 
       Y = (int)(rect1.Y * ratioY), 
       Width = (int)(rect1.Width * ratioX), 
       Height = (int)(rect1.Height * ratioY) 
      }; 
      try 
      { 
       BitmapSource bs = new CroppedBitmap((BitmapSource)LoadedImage.Source, rcFrom); 
       LoadedImage.Source = bs; 
       SetImageStretch(LoadedImage); 
       SetElementVisibility(Visibility.Hidden, Visibility.Visible, SelectionRectangle); 
      } 


    private void SetImageStretch(Image image) 
    { 
     if (image.Source.Width > image.ActualWidth || image.Source.Height > image.ActualHeight) 
      image.Stretch = Stretch.Uniform; 
     else image.Stretch = Stretch.None; 
    } 

Weiß jemand, wie man das Problem lösen?
Here how it looks before cropping

How it looks after cropping

+0

Ohne eine gute [MCVE], die zuverlässig reproduziert Ihr Problem, ist es unmöglich zu wissen, welche Antwort Sie benötigen. Höchstwahrscheinlich sollten Sie überhaupt keine neue Bitmap erstellen und stattdessen sollten Sie sich auf die Transformationsoptionen für das Image-Element verlassen, um einfach festzulegen, wie die ursprüngliche Bitmap auf dem Bildschirm dargestellt wird. Bitte stellen Sie eine gute MCVE zur Verfügung und erklären Sie _precely_, was dieser Code jetzt tut und was er stattdessen tun soll. –

Antwort

0

Wahrscheinlich ist das Problem mit der Bildauflösung, z.B. 300 dpi, im Vergleich zur Bildschirmauflösung (höchstwahrscheinlich 96 dpi). Haben Sie PixelWidth und PixelHeight des Bildes überprüft?

+0

Meine Pixelbreite = 1920, Pixelhöhe = 1080, dpiX = 72, dpiY = 72 und PixelFormat ist BGR32. Warum aber ratioX und ratioY nicht richtig beschneiden? – Anton

+0

Muss ich das Bild in Bildschirmauflösung konvertieren oder gibt es eine andere Lösung? P.S. Meine Anwendung sollte Tausende von Bildern verarbeiten und konvertieren alle auf Bildschirmauflösung wird sehr langsam Lösung – Anton

+0

Vielen Dank. Es half. – Anton