2016-08-19 2 views
1

이미지 자르기에 문제가 있습니다. 직사각형으로 이미지를 자르려고하면 자르기 영역이 이상한 값으로 설정됩니다.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> 

여기에서 나는 작물 이미지 방법 :

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

사람이 알고 있나요가 어떻게 해결하기 위해 여기에 는 XAML 코드?
Here how it looks before cropping

How it looks after cropping

+0

안정적으로 문제를 재현하는 좋은 [mcve]가 없으면 필요한 답변을 확실히 알 수 없습니다. 대체로 새로운 비트 맵을 생성해서는 안되며 대신 원래의 비트 맵이 화면에 어떻게 표시되는지를 제한하기 위해'Image' 요소의 변환 옵션에 의존해야합니다. 좋은 MCVE를 제공해 주시고 그 코드가 지금하고있는 일과 원하는 일을 _precisely_ 설명하십시오. –

답변

0

대부분의 경우 문제가되는 화상 해상도, 예를 들어, 300 dpi, 화면 해상도 (대부분 96 dpi). 이미지의 PixelWidth 및 PixelHeight를 확인 했습니까?

+0

내 PixelWidth = 1920, PixelHeight = 1080, dpiX = 72, dpiY = 72 및 PixelFormat은 BGR32입니다. 그러나 왜 ratioX와 ratioY를 사용하여 올바른 자르기를 수행하지 못합니까? – Anton

+0

이미지를 화면 해상도로 변환해야합니까 아니면 다른 해결책이 있습니까? 오후 8시 30 분 P.S. 내 응용 프로그램은 수천 개의 이미지를 처리하고 모든 화면 해상도로 변환해야합니다. 매우 느린 해결책이 될 것입니다. – Anton

+0

감사합니다. 도움이되었습니다. – Anton