Преобразование изображения WPF

#c# #wpf #image #animation #transformation

#c# #wpf #изображение #Анимация #преобразование

Вопрос:

У меня есть простые графические изображения, которые я хотел бы преобразовать при срабатывании событий. Преобразовать означает изменить ширину или переместить его в другое положение.

На данный момент я использую элемент Изображения панели инструментов и анимации с помощью раскадровки, например, DoubleAnimation или ThicknessAnimation.

Однако возникают следующие проблемы:

  1. изображения мерцают при изменении ширины
  2. качество изображения варьируется, поддерживает ли WPF векторную графику?

Что касается 1. мой вопрос в том, следует ли использовать другие анимации.


Итак, я попробовал преобразование, смотрите Код :

     <Image Height="150" HorizontalAlignment="Left" Margin="12,0,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Source="images/side_view.jpg" Width="1244">
        <Image.RenderTransform>
            <ScaleTransform x:Name="Minimize"  ScaleX="1.0" ScaleY="1.0"/>
        </Image.RenderTransform>
    </Image>

    <Button Content="Next Train" Height="23" HorizontalAlignment="Left" Margin="528,233,0,0" Name="btnNext" VerticalAlignment="Top" Width="75" />
    <Grid.Triggers>
        <EventTrigger RoutedEvent="Button.Click" SourceName="btnNext">
            <BeginStoryboard>
                <Storyboard TargetName="Minimize" TargetProperty="ScaleX">
                    <DoubleAnimation To="0.65" Duration="0:0:2"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
  

Работает так же, как анимация, которую я применил к ширине и полям. Однако оно все еще мерцает! Есть ли какие-либо разумные объяснения?

Ответ №1:

Если вы анимируете ширину изображения, вы заставляете WPF повторно отображать изображение и каждый раз создавать его из scatch. Оно проходит как через процесс компоновки, так и через процесс рендеринга, из-за чего оно мерцает и работает не так хорошо, как могло бы быть.

Лучшим вариантом здесь является анимация ScaleTransform. Преобразование масштаба выполняется полностью аппаратно через DirectX и поэтому будет чрезвычайно быстрым, оно не будет мерцать, а качество изображения должно оставаться практически неизменным на протяжении всего процесса. (если, конечно, вы существенно не изменяете его размер, в этом случае вы потеряете точность.)

Комментарии:

1. @eldad-katz: Я попробовал ScaleTransform, однако результат тот же — есть идеи?

2. Все должно работать так, как предложено. В коде, который вы ввели, я не вижу ScaleTransform с именем Minimize .. но в любом случае, это должно работать идеально. вы уверены, что все, что вы делаете, это анимируете ScaleTransform?

3. @elad-katz: Вы правы, я вставил неправильные коды вместе. Однако они не так уж сильно отличаются, я отредактировал это. Возможно, с этим уже все в порядке, но это не соответствует моему воображению. Это полный код: pastebin.com/cYx5exFx

4. Я копирую и вставляю его на свой компьютер, и он работает отлично, очень быстро и все такое… либо что-то другое искажает его на вашем компьютере, либо, возможно, вы используете чертовски большое изображение. в любом случае код должен работать очень быстро для вас.