2016-08-19 1 views
1

J'ai un problème avec le recadrage d'image. Lorsque j'essaie de recadrer une image avec un rectangle, la zone de recadrage est réglée sur une valeur étrange. Voici le code XAML:Restauration d'image WPF

<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> 

et voici comment je découpez l'image:

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

Quelqu'un sait comment résoudre ce problème?
Here how it looks before cropping

How it looks after cropping

+0

Sans un bon [mcve] qui reproduit fidèlement votre problème, il est impossible de savoir avec certitude quelle réponse vous avez besoin. Très probablement, vous ne devriez pas du tout créer une nouvelle image, et vous devriez plutôt vous fier aux options de transformation de l'élément 'Image' pour limiter simplement la façon dont le bitmap original est présenté à l'écran. S'il vous plaît fournissez un bon MCVE et expliquez _precisely_ ce que ce code fait maintenant et ce que vous voulez qu'il fasse à la place. –

Répondre

0

Très probablement le problème est avec une résolution d'image, par exemple 300 dpi, par rapport à la résolution d'écran (le plus probablement 96 dpi). Avez-vous vérifié PixelWidth et PixelHeight de l'image?

+0

Mes PixelWidth = 1920, PixelHeight = 1080, dpiX = 72, dpiY = 72 et PixelFormat est BGR32. Mais pourquoi utiliser ratioX et ratioY ne fait pas le bon recadrage? – Anton

+0

Ai-je besoin de convertir l'image en résolution d'écran ou y a-t-il une autre solution? P.S. Mon application devrait traiter des milliers d'images et de convertir chaque résolution à l'écran sera une solution très lente – Anton

+0

Merci. Ça m'a aidé. – Anton