2014-03-12 2 views
1

내 그림에로드 된 그림이 있습니다 (원본은 BitmapImage, 늘이기는 Uniform입니다). 내가 이미지 컨트롤에 따라 소스 이미지에서 프레임 좌표를 테두리 컨트롤을 배치하고 싶습니다.변환 그림이 캔버스 좌표로 일치합니다.

소스 이미지 높이 : 1500 픽셀

소스 이미지의 폭 : 1000 픽셀

프레임 X 700 개 픽셀

프레임 Y : 500 개 화소

프레임 예

너비 : 100 픽셀

fram 전자 높이 : 150 개 픽셀

나는

var verticalRatio = this.ImageBitmap.ActualHeight/((BitmapImage)this.ImageBitmap.Source).PixelHeight; 
var horizontalRatio = this.ImageBitmap.ActualWidth/((BitmapImage)this.ImageBitmap.Source).PixelWidth; 

국경의 크기 일 것

을 시도했지만, 테두리 이동한다. 나는 이미지가 화면 크기를 조절하고 그림이 이미지 안에 약간의 여백을 가지고 있기 때문에 이런 현상이 발생한다고 생각합니다.

Something like this

나는이 문제를 해결하기 위해 어떻게해야합니까?

감사합니다.

답변

0

답변을 찾았습니다. Canvas 컨트롤을 사용하여 하나의 상위 컨테이너에 배치 된 현재 Image 컨트롤의 비율과 시프트를 계산합니다. 나는 정적 방법으로 도우미에서이 코드를 배치 :

Width = box.Size.Width * _horizontalRatio, 
Height = box.Size.Height * _verticalRatio, 
Canvas.SetLeft(contentControl, _horizontalShift + box.TopLeft.X * _horizontalRatio); 
Canvas.SetTop(contentControl, _verticalShift + box.TopLeft.Y * _verticalRatio); 
: 다음

ImageHelper.CalculateRatios(this.LayoutCanvas, (BitmapImage)this.ImageFingersBitmap.Source, ref _horizontalShift, ref _verticalShift, ref _horizontalRatio, ref _verticalRatio); 

내가 내 경계의 크기와 위치를 계산하는 데 사용

public static void CalculateRatios(Panel panel, BitmapImage image, ref double horizontalShift, ref double verticalShift, ref double horizontalRatio, ref double verticalRatio) 
    { 
     panel.UpdateLayout(); 

     var ratioSource = image.PixelWidth/image.PixelHeight; 
     var ratioImage = panel.ActualWidth/panel.ActualHeight; 

     Size pictureInControlSize; 

     if (ratioSource > ratioImage) // image control extended in height 
     { 
      pictureInControlSize = new Size(panel.ActualWidth, panel.ActualWidth/ratioSource); 
     } 
     else if (ratioSource < ratioImage) // image control extended in width 
     { 
      pictureInControlSize = new Size(panel.ActualHeight * ratioSource, panel.ActualHeight); 
     } 
     else // image control have the same proportions 
     { 
      pictureInControlSize = new Size(panel.ActualWidth, panel.ActualHeight); 
     } 

     horizontalShift = (panel.ActualWidth - pictureInControlSize.Width)/2d; 
     verticalShift = (panel.ActualHeight - pictureInControlSize.Height)/2d; 
     horizontalRatio = pictureInControlSize.Width/image.PixelWidth; 
     verticalRatio = pictureInControlSize.Height/image.PixelHeight; 
    } 

우선은 비율을 계산