2010-02-04 14 views
11

Tenemos una imagen donde creamos coordenadas de cuadro de vista que son puntos topleft/bottom right dentro de la imagen que están configurados para permitir ver porciones de una imagen en diferentes momentos en nuestra aplicación. En WPF, ¿cómo cargamos una imagen y con los puntos topleft/bottom right dentro de esa imagen, solo mostramos la porción de la imagen dentro de ese cuadro de vista?En WPF, ver una parte de una imagen

Respuesta

14

Puede hacer esto con un CroppedBitmap:

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

Esto mostrará la región de 50x50 de la imagen a partir de la posición (20,20)

0

Me parece que se puede hacer que la imagen controle una parte de la caja de vista como se muestra abajo:

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

Esto le dará una caja de vista 50x50. obviamente puedes cambiar la altura y el ancho para que se adapte a tus necesidades. Uso un scrollviewer para desplazarme por la viewbox más pequeña.

1

El uso de un RenderTransform con un clip funciona incluso mejor, ya que el CroppedBitmap es algo inmutable:

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

Esto mostrará la imagen en el desplazamiento (100, 100) con un tamaño de (150, 150), así que no olvides que el rect debe incluir los startoffsets.

Aquí es un método para calcularlo en código:

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) 
    }; 
} 
Cuestiones relacionadas