2010-06-09 110 views
39

我最近學會了如何使用'TransformedBitmap'和'RotateTransformed'類來旋轉BitmapImage。現在我可以對我的圖像執行順時針旋轉。但是,我如何翻轉圖像?我無法找到類來執行BitmapImage的水平和垂直翻轉。請幫我弄清楚如何做到這一點。例如,如果我的圖像是一個看起來像'd'的圖形,那麼垂直翻轉會導致類似'q'的東西,而水平翻轉會導致類似'b'的東西。如何翻轉圖像wpf

回答

98

Use a ScaleTransform其中ScaleX爲-1表示水平,ScaleY表示-1表示垂直翻轉,適用於圖像的RenderTransform屬性。在圖像上使用RenderTransformOrigin="0.5,0.5"確保你的形象被圍繞其中心翻轉,這樣你就不必應用附加TranslateTransform將其移動到的地方:

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

的水平翻轉和

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

爲垂直。

如果你想這樣做的代碼隱藏在C#中應該是這個樣子:

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

:)你的速度更快。 +1。 – Anvaka 2010-06-09 11:22:29

+0

我怎麼能通過C# – Shashank 2010-06-09 11:28:20

+0

thnks工作 – Shashank 2010-06-09 11:48:22

1

您可以使用ScaleTransformScaleX/ScaleY

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

舉你的翻轉多一點「深度」,看起來更像是一個真正的翻轉,你可能想用一個更小的尺度變換做一個歪斜變換。

你會想歪斜對象約20度,使它看起來好像它在3D中翻轉。這是一個可憐的人3D翻轉。你可以在WPF中完成一個真正的3D翻轉,但需要更多的工作。

這會爲您提供看起來更乾淨的動畫,然後您可以在兩個不同的面板上切換可見性,爲您的元素提供正面和背面的印象。

<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

有趣的3D翻轉的用戶控件:http://flipcontrol.codeplex.com/releases/view/22358

在你的情況,你將不得不在兩側顯示相同的圖像。

+0

翻轉容器控制檢查http://clipflair.codeplex.com,在Client \ ZUI文件夾下的FlipPanel項目 – 2015-12-04 12:16:02

2

水平(僅)翻轉btw的快速技巧是將FlowDirection屬性設置爲FlowDirection.RightToLeft。如果該組件是一個容器,雖然,它的一些孩子可能會有不同的解讀財產(定製邏輯)

+0

這只是救了我,因爲它翻轉圖像而不移動它。 – 2016-01-27 11:20:24

+1

順便說一句,如果你嘗試使用ScaleTransform和-1進行x-scale,那麼你可能錯過了RenderTransformOrigin =「0.5,0.5」。然而,使用FlowDirection讀取代碼(或放入XAML)確實更直接,而不是轉換方法 – 2016-01-28 18:34:20

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> 

像這樣創建的圖像分量。當它的源被設置時,圖像將從左到右翻轉。