Я не могу сделать видеофайл из своих изображений, потому что мне нужно сохранить прозрачность файлов 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, поскольку я думаю, что это более эффективно, я также рекомендую вам поэкспериментировать с примером 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();
}
}
//Для 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>