2016-08-19 2 views
1

У меня проблема с обрезкой изображения. Когда я пытаюсь обрезать изображение с помощью прямоугольника, область обрезки задается некоторым странным значением. Вот XAML код: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> 

и вот как я обрезать изображение:

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

Кто-нибудь знает, как исправить это?
Here how it looks before cropping

How it looks after cropping

+0

Без хорошей [mcve], которая надежно воспроизводит вашу проблему, невозможно точно знать, какой ответ вам нужен. Скорее всего, вам не следует создавать новое растровое изображение вообще, и вместо этого следует полагаться на опции преобразования для элемента «Image», чтобы просто ограничить, как оригинальная растровая карта отображается на экране. Пожалуйста, предоставьте хороший MCVE и объясните _precisely_, что этот код делает сейчас и что вы хотите, чтобы он делал вместо этого. –

ответ

0

Скорее всего проблема с разрешением изображения, например, 300 dpi, по сравнению с разрешением экрана (скорее всего, 96 точек на дюйм). Вы проверили PixelWidth и PixelHeight?

+0

My PixelWidth = 1920, PixelHeight = 1080, dpiX = 72, dpiY = 72, а PixelFormat - BGR32. Но почему использование ratioX и ratioY не делает правильного обрезки? – Anton

+0

Нужно ли преобразовывать изображение в разрешение экрана или есть другое решение? P.S. Мое приложение должно обрабатывать тысячи изображений и конвертировать каждый в разрешение экрана будет очень медленным решением. – Anton

+0

Спасибо. Это помогло. – Anton