В WPF просмотрите часть изображения

У нас есть изображение, в котором мы создаем координаты окна обзора, которые находятся в верхних/нижних правых точках в изображении, которые настроены для просмотра частей изображения в разное время в нашем приложении. В WPF, как мы загружаем изображение, а также с верхними/нижними правыми точками внутри этого изображения, показываем только часть изображения внутри этого окна просмотра?

Ответ 1

Вы можете сделать это с помощью CroppedBitmap:

<Image>
  <Image.Source>
    <CroppedBitmap Source="<path to source image>" SourceRect="20,20,50,50"/>
  </Image.Source>
</Image>

Это отобразит область 50x50 изображения, начиная с позиции (20,20)

Ответ 2

Использование RenderTransform с клипом работает еще лучше, потому что CroppedBitmap является незаменимым:

<Image x:Name="MyImage">
    <Image.RenderTransform>
        <TranslateTransform X="-100" Y="-100" />
    </Image.RenderTransform>
    <Image.Clip>
        <RectangleGeometry Rect="0 0 250 250" />
    </Image.Clip>
</Image>

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

Здесь можно вычислить его в коде:

public static void ClipImage(System.Windows.Controls.Image image, Rect visibleRect)
{
    image.RenderTransform = new TranslateTransform(-visibleRect.X, -visibleRect.Y);
    image.Clip = new RectangleGeometry
    {
        Rect = new Rect(
            0, 
            0, 
            visibleRect.X + visibleRect.Width, 
            visibleRect.Y + visibleRect.Height)
    };
}

Ответ 3

Мне кажется, что вы можете сделать элемент управления изображением частью окна просмотра, как показано ниже:

<Viewbox Name="vBox" Stretch="None" HorizontalAlignment="Left" 
VerticalAlignment="Top" Height="50" Width="50">
<Image Name="ClippedImage" 
Source="{Binding NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}" 
Stretch="None" />
</Viewbox>

Это даст вам окно 50x50. очевидно, вы можете изменить высоту и ширину в соответствии с вашими потребностями. Я использую scrollviewer для панорамирования меньшего окна просмотра.