Плавная анимация (видео) из png изображений

2

Я не могу сделать видеофайл из своих изображений, потому что мне нужно сохранить прозрачность файлов png.

Я хочу получить 25 кадров в секунду без задержки.

1000+ изображения 1920x1080 от 8 КБ до 5 МБ

Как я могу это достичь?

Ниже приведены примеры, которые я пробовал:

1 пример: торможение картинки из-за загрузки изображений.

int counter = 0;
DispatcherTimer dT = new DispatcherTimer();

public Png()
{
   InitializeComponent();

   dT.Interval = new TimeSpan(0, 0, 0, 0, 40);
   dT.Tick += new EventHandler(dT_Tick);
   dT.Start();
}

void dT_Tick(object sender, EventArgs e)
{
   var image = new BitmapImage(new Uri("C:\\" + counter + ".png"));
   imageBox.Source = image;
   counter++;

   if (counter == 1000)
   {
     dT.Stop();
   }
}

Пример 2: Очень забито ОЗУ из-за большого количества файлов. И тоже ощущается сопротивление.

    int counter = 0;
    DispatcherTimer dT = new DispatcherTimer();
    private BitmapImage[] images;

    public Png()
    {
       InitializeComponent();

       images = new BitmapImage[1000];

       for(int i = 0 ; i < images.Length; i++)
       {
          images[i] = new BitmapImage(new Uri("C:\\" + i + ".png"));
       }

       dT.Interval = new TimeSpan(0, 0, 0, 0, 40);
       dT.Tick += new EventHandler(dT_Tick);
       dT.Start();
    }



   void dT_Tick(object sender, EventArgs e)
   {
      imageBox.Source = images[counter];
      counter++;

      if (counter == 1000)
      {
        dT.Stop();
      }
   } 

3 пример:

Я попытался использовать Queue

Queue пыталась использовать в качестве буфера изображений. Сначала я загрузил 10 изображений в Queue. Показан первый снимок. И как только я показал вторую картинку, я удалил первый и добавил одиннадцатый из другого потока в Queue.

Но у меня создалось впечатление, что я поступаю неправильно, также чувствую торможение, много раз исправлял код и в итоге случайно удалялся.

  • 0
    Вы используете ключевые кадры смешивания для этого?
  • 0
    Вы пытались создать GIF? Вы можете использовать его как изображение
Показать ещё 4 комментария
Теги:
wpf
bitmapimage

2 ответа

0

Я опубликую изменения в примере 2, поскольку я думаю, что это более эффективно, я также рекомендую вам поэкспериментировать с примером 1.

Добавьте еще одно окно изображения в форму и убедитесь, что оба окна изображений имеют одинаковые позиции и размер.

void dT_Tick(object sender, EventArgs e)
{
      if (counter % 2 != 0) {
         imageBox1.Source = images[counter];
         imageBox1.Visible = true;
         imageBox2.Visible = false;
      }
      else {
         imageBox2.Source = images[counter];
         imageBox2.Visible = true;
         imageBox1.Visible = false;
      }
      counter++;

      if (counter == 1000)
      {
        dT.Stop();
      }
} 
  • 0
    Это ничего не меняет (((
  • 0
    Вы пытались изменить свойство DoubleBuffer элемента управления на true?
Показать ещё 1 комментарий
-1

//Для FrameRate добавьте это в свой XAML.

<DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="0:0:0.5" 
                 From="1.0" To="0.5" Timeline.DesiredFrameRate="25" />

Активация ключевого кадра возможна в WPF. Добавьте все изображения в раскадровку, вставив ключевые кадры для каждого изображения. Ключевые кадры выглядят как фигуры алмаза на вашей временной шкале. Вы можете добавить их manullay в объекты и временную шкалу.

//Гладкие анимации

          <!-- Animate the TranslateTransform X property
               from 0 to 350, then 50,
               then 200 over 10 seconds. -->

          <DoubleAnimationUsingKeyFrames
            Storyboard.TargetName="MyAnimatedTranslateTransform"
            Storyboard.TargetProperty="X"
            Duration="0:0:10">
            <LinearDoubleKeyFrame Value="0" KeyTime="0:0:0" />
            <LinearDoubleKeyFrame Value="350" KeyTime="0:0:2" />
            <LinearDoubleKeyFrame Value="50" KeyTime="0:0:7" />
            <LinearDoubleKeyFrame Value="200" KeyTime="0:0:8" />                          
          </DoubleAnimationUsingKeyFrames>
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Rectangle.Triggers> 
</Rectangle>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню