Недавно я научился вращать BitmapImage, используя классы TransformedBitmap и RotateTransformed. Теперь я могу выполнять вращения по часовой стрелке на моих изображениях. Но как я FLIP изображение? Я не могу найти класс для выполнения горизонтальных и вертикальных переворотов BitmapImage. Пожалуйста, помогите мне выяснить, как это сделать. Например, если мое изображение было рисунком, похожим на "d", то вертикальный флип привел бы к чему-то вроде "q", а горизонтальный флип привел бы к чему-то вроде "b".
Как перевернуть изображение в wpf
Ответ 1
Использовать ScaleTransform с ScaleX -1 для горизонтального и ScaleY -1 для вертикального листания, применяемого к свойству image 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>
для вертикали.
Если вы хотите сделать это в кодировке, на С# он должен выглядеть примерно так:
img.RenderTransformOrigin = new Point(0.5,0.5);
ScaleTransform flipTrans = new ScaleTransform();
flipTrans.ScaleX = -1;
//flipTrans.ScaleY = -1;
img.RenderTransform = flipTrans;
Ответ 2
Чтобы дать вашему флип немного больше "глубины", чтобы он выглядел скорее как настоящий флип, вы, вероятно, захотите сделать косовое преобразование с меньшим преобразованием шкалы.
Вы хотите перекосить объект примерно на 20 градусов, чтобы он выглядел так, как будто он переворачивается в 3D. Это бедный mans 3D flip. Вы можете выполнить настоящий 3D-флип в WPF, но это требует немного больше работы.
Это даст вам анимацию, которая выглядит более чистой, а затем вы можете переключать видимость на двух разных панелях, чтобы создать впечатление о фронте и задней стороне вашего элемента.
<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>
Ответ 3
Интересный 3D-отлаживаемый пользовательский контроль: http://flipcontrol.codeplex.com/releases/view/22358
В вашем случае вам придется отображать на обеих сторонах одно и то же изображение.
Ответ 4
Быстрый трюк для горизонтального (только) flipping btw - установить свойство FlowDirection в FlowDirection.RightToLeft. Если компонент является контейнером, хотя некоторые его дети могут интерпретировать это свойство по-разному (пользовательская логика)
Ответ 5
Вы можете использовать ScaleTransform с отрицательным ScaleX
/ScaleY
:
<TextBlock Text="P">
<TextBlock.RenderTransform>
<ScaleTransform ScaleY="-1" ScaleX="-1" />
</TextBlock.RenderTransform>
</TextBlock>