Покадровая анимация png

164
19 февраля 2019, 16:40

Есть ~100 файлов png нужно их как бы анимировать, весят они от 8кб до 4мб.

Но как то через чур всё тормознуто выходит.

Можно ли тут что то оптимизировать или сделать более правильно ?

    int counter = 0;
    DispatcherTimer dT = new DispatcherTimer();
    public Png()
    {
       InitializeComponent();
       dT.Interval = new TimeSpan(0, 0, 0, 0, 25);
       dT.Tick += new EventHandler(dT_Tick);
       dT.Start();
    }
    void dT_Tick(object sender, EventArgs e)
    {
       var image = new BitmapImage(new Uri("C:\\" + counter + ".png"));
       imageKonteiner.Source = image;
       counter++;
       if (counter == 100)
       {
         dT.Stop();
       }
    }

UPD - Пробовал и так заранее в память запихать, вышло тоже не очень(, память процесса подпрыгивает до 4гб :

    int counter = 0;
    DispatcherTimer dT = new DispatcherTimer();
    private BitmapImage[] images;
    public Png()
    {
       InitializeComponent();
       images = new BitmapImage[100];
       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, 25);
       dT.Tick += new EventHandler(dT_Tick);
       dT.Start();
    }

   void dT_Tick(object sender, EventArgs e)
   {
      imageKonteiner.Source = images[counter];
      counter++;
      if (counter == 100)
      {
        dT.Stop();
      }
   } 
Answer 1
У меня оригинальные изображения в 1920 x 1080 и отображать их 
нужно в том же размере. Что то похожее на screensaver у Windows

такие изображения отрисовать быстро(на всех компьютерах) невозможно. Все упирается или в количество оперативки(загрузить все обьекты) или в быстроту работы винчестера(считать каждую картинку на НЕдефрагментированном диске будет довольно медленная задача, но с ССД выйдет быстренько)

_

Можно пойти неправильным путем:

Сделать FIFO-list (в шарпе это Queue) и при помощи его сделать буфер картинок, и картинки подгружать на 10-15 штук относительно того что сейчас используется. Кароче, буферизация изображений в нужном количестве размером(подбирается опытным путем оптимальный из соображений занятая оперативка/быстрота работы). А так же не забываем диспоузить изображения что б оперативу освобждать!

Внутри FIFO сохранять, скажем, инстансы структуры: Index Image

Так же иметь Array путей. Индекс аррея будет равнятся индексу элемента FIFO. Но имеет в себе полный список путей изображений что бы понятно было с какого пути нужно будет грузить следующую картинку. Собственно, если индекс превышает количество ячеек - нужно начинать с первой.

Этот буфер в отдельном потоке подгружает нужное количество изображений, скажем, до 15 элементов начиная с занаддного индекса (картинка которая сейчас отрисовывается).

Заданный индекс меняется в то время, как отрисовывается теперешний твой кадр.

Можно пойти ВОЗМОЖНО правильным путем (GIF):

Смонтировать большую гифку и подгружать ее. Я не уверен сработает ли этот путь т.к. не знаю как гифки сохраняются в оперативке. Вполне возможно что как набор BMP кадров... Так что может и не сработать.

А можно пойти ПРАВИЛЬНЫМ путем (Video):

  • Смонтировать видео, заменить Transparancy слой на хрома-кей, сжать его в x264 и потом проигрывать по кругу ВИДЕО обрабатывая хромакей. Это оптимальнее с точки зрения занимаемого места и проще в реализации(видео отобразить)
  • Если же там полупрозрачные поверхности есть.... То смонтировать видео, экспортировать в видеоформат с поддержкой альфа-канала(RGBA), сжать его в x264. А потом реализовать поддержку обработки альфа-канала в твоей программе.

теперь на тему:

и память процесса переваливала за 4гб, хотя файлов там было на 1гб. 

это потому, что ты подгружаешь в BMP (Bitmap) то есть в несжатую картинку. По-другому не выйдет.

READ ALSO
Visual Studio Installer DotNetFX461

Visual Studio Installer DotNetFX461

Пытаюсь к инталлятору положить DotNetFX461Если не выполнять ни каких действий, то при сборке проекта ругается:

174
YII2 SMTP email Expected response code 354 but got code &ldquo;554&rdquo;

YII2 SMTP email Expected response code 354 but got code “554”

Друзья помогите побороть ошибку при отправке email , обычная форма обратной связи

354
Проблема с вызовом функции SOAP

Проблема с вызовом функции SOAP

Делаю подключение к серверу

341