Плавная анимация (видео) из png изображений - PullRequest
0 голосов
/ 19 октября 2018

Я не могу сделать видеофайл из моих изображений, потому что мне нужно сохранить прозрачность файлов 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.

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

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

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

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

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

// Плавная анимация

          <!-- Animate the TranslateTransform's 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>
0 голосов
/ 19 октября 2018

Я опубликую изменения в Примере 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();
      }
} 
...