Как получить границы увеличенного изображения - PullRequest
0 голосов
/ 11 октября 2019

Я выполняю масштабирование изображения, после масштабирования мне нужно найти текущие видимые границы (то есть) границы увеличенной области.

Поскольку мне нужно добавить еще один элемент (прямоугольник или любую форму) в центреизображения, поэтому даже после панорамирования его следует добавить в центр увеличенного изображения.

Необходимо найти границы, отмеченные на изображении.

Увеличенное изображение

  <Grid>      
   <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="50"/>
    </Grid.RowDefinitions>
    <ScrollViewer HorizontalScrollBarVisibility="Disabled" 
                  VerticalScrollBarVisibility="Disabled" >
        <Grid x:Name="grid1" Background="AliceBlue" MouseLeftButtonDown="Grid1_MouseDown"
              MouseMove="Grid1_MouseMove" MouseLeftButtonUp="Grid1_MouseLeftButtonUp">
            <Image x:Name="image1" Source="2.bmp"></Image>
        </Grid>
    </ScrollViewer>

    <Grid Grid.Row="1" VerticalAlignment="Center">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="100"/>
        </Grid.ColumnDefinitions>

        <Slider  Width="500" x:Name="slider" ValueChanged="Slider_ValueChanged" Minimum="-50" Maximum="400" Value="100" TickFrequency="10"></Slider>
        <TextBlock Grid.Column="1" Text="{Binding ElementName=slider, Path=Value}"></TextBlock>
    </Grid>

 MatrixTransform zoomMatrixTransform;
    Point start;
    Point origin;
    Matrix matrix;
   private void Slider_ValueChanged(object sender, 
         RoutedPropertyChangedEventArgs<double> e)
    {
        var zoomLevel = e.NewValue;
        var factor = zoomLevel / 100;
        Matrix matrix = Matrix.Identity;
        matrix.Scale(factor, factor);
        image1.RenderTransformOrigin = new Point(0.5, 0.5);
        zoomMatrixTransform = new MatrixTransform(matrix);
        image1.RenderTransform = zoomMatrixTransform;
    }

   private void Grid1_MouseDown(object sender, MouseButtonEventArgs e)
    {
        start = e.GetPosition(grid1);
        origin = new Point(zoomMatrixTransform.Matrix.OffsetX, zoomMatrixTransform.Matrix.OffsetY);

        image1.CaptureMouse();
    }

    private void Grid1_MouseMove(object sender, MouseEventArgs e)
    {
        if (!image1.IsMouseCaptured) return;

        Point p = e.MouseDevice.GetPosition(image1);

        var rect2 = new Rect(image1.RenderSize);
        var bounds = 
        image1.TransformToAncestor(grid1).TransformBounds(rect2);

        matrix = zoomMatrixTransform.Matrix;
        Vector v = start - e.GetPosition(grid1);
        matrix.OffsetX = origin.X - v.X;
        matrix.OffsetY = origin.Y - v.Y;
        zoomMatrixTransform.Matrix = matrix;

        image1.RenderTransformOrigin = new Point(0.5, 0.5);
        image1.RenderTransform = zoomMatrixTransform;
    }

    private void Grid1_MouseLeftButtonUp(object sender, 
    MouseButtonEventArgs e)
    {
        image1.ReleaseMouseCapture();
    }
...