Подтвердить что ты не робот

Как перевернуть изображение в wpf

Недавно я научился вращать BitmapImage, используя классы TransformedBitmap и RotateTransformed. Теперь я могу выполнять вращения по часовой стрелке на моих изображениях. Но как я FLIP изображение? Я не могу найти класс для выполнения горизонтальных и вертикальных переворотов BitmapImage. Пожалуйста, помогите мне выяснить, как это сделать. Например, если мое изображение было рисунком, похожим на "d", то вертикальный флип привел бы к чему-то вроде "q", а горизонтальный флип привел бы к чему-то вроде "b".

4b9b3361

Ответ 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>