2010-06-09 13 views
39

Recentemente ho imparato a ruotare un BitmapImage utilizzando le classi 'TransformedBitmap' e 'RotateTransformed'. Ora sono in grado di eseguire rotazioni in senso orario sulle mie immagini. Ma come FLIP un'immagine? Non riesco a trovare la classe (es) per eseguire lanci orizzontali e verticali di un BitmapImage. Per favore aiutami a capire come si fa. Per esempio, se la mia immagine fosse un disegno che assomiglia a una "d", allora un capovolgimento verticale risulterebbe in qualcosa di simile a una "q", e un capovolgimento orizzontale risulterebbe in qualcosa come una "b".Come capovolgere l'immagine nel wpf

risposta

98

Use a ScaleTransform con una ScalaX di -1 per orizzontale e ScalaY di -1 per il capovolgimento verticale, applicato alla proprietà RenderTransform dell'immagine. Utilizzando RenderTransformOrigin="0.5,0.5" sull'immagine assicura la vostra immagine viene capovolta attorno al suo centro, in modo da non dovrà applicare un ulteriore TranslateTransform per spostare in posizione:

<Image Source="a.jpg" Padding="5" RenderTransformOrigin="0.5,0.5"> 
    <Image.RenderTransform> 
    <ScaleTransform ScaleX="-1"/> 
    </Image.RenderTransform> 
</Image> 

per flipping orizzontale e

<Image Source="a.jpg" Padding="5" RenderTransformOrigin="0.5,0.5"> 
    <Image.RenderTransform> 
    <ScaleTransform ScaleY="-1"/> 
    </Image.RenderTransform> 
</Image> 

per verticale.

Se si vuole fare in code-behind, in C# che dovrebbe essere simile a questa:

img.RenderTransformOrigin = new Point(0.5,0.5); 
ScaleTransform flipTrans = new ScaleTransform(); 
flipTrans.ScaleX = -1; 
//flipTrans.ScaleY = -1; 
img.RenderTransform = flipTrans; 
+0

:) Sei stato più veloce. +1. – Anvaka

+0

Come posso farlo tramite C# – Shashank

+0

con il suo funzionamento – Shashank

1

È possibile utilizzare ScaleTransform con negativo ScaleX/ScaleY:

<TextBlock Text="P"> 
    <TextBlock.RenderTransform> 
    <ScaleTransform ScaleY="-1" ScaleX="-1" /> 
    </TextBlock.RenderTransform> 
    </TextBlock> 
9

Per dare la tua vibrazione un po 'più "profonda" in modo che sembri un vero capovolgimento che probabilmente vuoi fare una trasformazione di skew con una trasformazione di scala più piccola.

Si dovrebbe inclinare l'oggetto di circa 20 gradi per farlo apparire come se stesse girando in 3D. Questo è un capolino in 3D. Puoi realizzare un vero 3D flip in WPF, ma questo richiede un po 'più di lavoro.

Questo ti darà l'animazione che sembra più pulita, quindi puoi attivare la visibilità su due pannelli diversi per dare l'impressione di un fronte e un retro del tuo elemento.

<DoubleAnimationUsingKeyFrames Storyboard.TargetName="MyControl" Storyboard.TargetProperty="(FrameworkElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"> 
    <SplineDoubleKeyFrame KeyTime="00:00:00.0" Value="1" /> 
    <SplineDoubleKeyFrame KeyTime="00:00:00.09" Value="0.3" /> 
    <SplineDoubleKeyFrame KeyTime="00:00:00.12" Value="0.6" />        
    <SplineDoubleKeyFrame KeyTime="00:00:00.15" Value="0.8" /> 
    <SplineDoubleKeyFrame KeyTime="00:00:00.18" Value="1" /> 
    <SplineDoubleKeyFrame KeyTime="00:00:00.2" Value="1" /> 
</DoubleAnimationUsingKeyFrames> 

<DoubleAnimationUsingKeyFrames Storyboard.TargetName="MyControl" Storyboard.TargetProperty="(FrameworkElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"> 
    <SplineDoubleKeyFrame KeyTime="00:00:00.0" Value="1" /> 
    <SplineDoubleKeyFrame KeyTime="00:00:00.09" Value="0.9" /> 
    <SplineDoubleKeyFrame KeyTime="00:00:00.18" Value="1" /> 
    <SplineDoubleKeyFrame KeyTime="00:00:00.2" Value="1" /> 
</DoubleAnimationUsingKeyFrames> 
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="MyControl" Storyboard.TargetProperty="(FrameworkElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleY)"> 
    <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0" /> 
    <SplineDoubleKeyFrame KeyTime="00:00:00.06" Value="-10" /> 
    <SplineDoubleKeyFrame KeyTime="00:00:00.09" Value="-20" /> 
    <SplineDoubleKeyFrame KeyTime="00:00:00.1" Value="20" /> 
    <SplineDoubleKeyFrame KeyTime="00:00:00.18" Value="0" /> 
</DoubleAnimationUsingKeyFrames> 
2

Interessante 3d UserControl flippable: http://flipcontrol.codeplex.com/releases/view/22358

Nel tuo caso si dovrà visualizzare su entrambi i lati della stessa immagine.

+0

per capovolgere il controllo del contenitore check out http://clipflair.codeplex.com, nella cartella Client \ ZUI il progetto FlipPanel –

2

Un trucco rapido per il ribaltamento orizzontale (solo) btw è impostare la proprietà FlowDirection su FlowDirection.RightToLeft. Se il componente è un contenitore, alcuni di essi potrebbero interpretare la proprietà in modo diverso (logica personalizzata)

+0

Questo mi ha appena salvato, poiché capovolge l'immagine senza spostarla. –

+1

btw, probabilmente ti mancava RenderTransformOrigin = "0.5,0.5" se si muoveva se provassi il ScaleTransform con -1 per x-scale.Tuttavia, è molto più semplice leggere nel codice (o inserire in XAML) anche con FlowDirection, piuttosto che l'approccio Transforms –

0
<Image x:Name="SampleImage" Margin="0" RenderTransformOrigin="0.5,0.5" > 
     <Image.LayoutTransform> 
      <TransformGroup> 
       <ScaleTransform ScaleY="1" ScaleX="-1"/> 
       <SkewTransform AngleY="0" AngleX="0"/> 
       <RotateTransform Angle="0"/> 
       <TranslateTransform/> 
      </TransformGroup> 
     </Image.LayoutTransform> 
    </Image> 

Creare un componente immagine come questo. E quando la sua sorgente è impostata, l'immagine girerà da sinistra a destra.

Problemi correlati