Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 7
.NET 4.x

Сделать анимацию облаков из 1493 кадров размером 1920х1080 со скоростью 25 кадров в секунду

15.10.2014, 07:24. Показов 1855. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь сделать анимацию облаков из 1493 кадров размером 1920х1080 со скоростью 25 кадров в секунду.

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<Window x:Class="TestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" WindowStyle="None" ResizeMode="NoResize" WindowState="Maximized" Loaded="Window_Loaded">
    <Window.Resources>
    </Window.Resources>
    <Grid>
        <Image Source="pack://application:,,,/Images/backgraund.jpg" Stretch="Fill" Margin="0"/>
        <Image Stretch="None" x:Name="imgOblaka">
        </Image>
        <Button Content="Button" HorizontalAlignment="Left" Margin="144,153,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    </Grid>
</Window>
Текст модуля:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace TestApp
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Storyboard oblakaStoryBoard;
        BitmapImage[] bmps;
        const int numofbmps = 1493;
        public MainWindow()
        {
            InitializeComponent();
            bmps = new BitmapImage[numofbmps];
            for (int i = 0; i < numofbmps; i++)
            {
                bmps[i] = new BitmapImage(new Uri(@"Images/Oblaka/oblaka_" + String.Format("{0:00000}", i) + ".png", UriKind.RelativeOrAbsolute));
            }
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            oblakaStoryBoard = new Storyboard();
            ObjectAnimationUsingKeyFrames oaukf = new ObjectAnimationUsingKeyFrames();
            oaukf.BeginTime = TimeSpan.FromSeconds(0);
            oaukf.RepeatBehavior = RepeatBehavior.Forever;
            Storyboard.SetTarget(oaukf, imgOblaka);
            Storyboard.SetTargetProperty(oaukf, new PropertyPath(Image.SourceProperty));
            for (int i = 0; i < numofbmps; i++)
            {
                DiscreteObjectKeyFrame dokf = new DiscreteObjectKeyFrame(bmps[i], TimeSpan.FromMilliseconds(i*40));
                oaukf.KeyFrames.Add(dokf);
            }
            oblakaStoryBoard.Children.Add(oaukf);
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            oblakaStoryBoard.Begin();
        }
    }
}
При клике на кнопку начинает воспроизводиться анимация. Но приложение начинает жрать оперативную память (доходит где-то до 4Гб) и анимация останавливается. Можно как-то сделать, чтобы картинки были в памяти в сжатом формате?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.10.2014, 07:24
Ответы с готовыми решениями:

Сделать из кадров видео - GIF-анимацию
Мне нужно создать гифку. Как это делается без понятия) Мне нужно примерно следующее: Я например снимаю видео, как моя собачка весело...

Перевод с кадров в секунду в мегабиты в секунду
Подскажите пожалуйста как переводить гугл не хочет)

Создание кадров с периодичностью 1 секунда и последующая обработка кадров
Добрый день! Я в матлабе новичок и хотел бы попросить помощи для написания кода. Мне нужно, чтобы происходила кадровая съемка с...

7
288 / 251 / 107
Регистрация: 26.10.2012
Сообщений: 796
15.10.2014, 08:39
Так анимации не делаются.
Ну подумайте сами BitmapImage - довольно тяжелый формат, занимает по 4 байта на каждый пиксель.
1493 картинки разрешением 1920 х 1080 занимают
1493 * 1920 * 1080 * 4 = 11 Гб информации
Единовременно никакая память столько картинок не выдержит. Подгружайте картинки динамически.
В данном случае лучше показывать одну анимированную .gif - ку вместо последовательноси картинок.
Или например поигрывать вместо картинок видео.
0
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 7
15.10.2014, 09:14  [ТС]
Да я об этом подумал. И посчитал уже сам сколько это в памяти займет. А у gif и у видео альфа канала нету. Так что наложить сверху не получится. Динамически подгружать - тормоза будут. Кстати, как их подгружать? Заводить таймер и по таймеру загружать? Что бы такое придумать...
0
288 / 251 / 107
Регистрация: 26.10.2012
Сообщений: 796
15.10.2014, 09:52
Как-то так..
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Image myImage; //Image куда подгружается картинка
 
void SetImage(BitmapImage bmpImage)
{
      myImage.Source = bmpImage;
}
 
bool  _processImageThread = true;
 
//вызывается в отдельном потоке
void UpdateImageThread()
{
  int i = 0;
  while(_processImageThread )
  {
    var bmpImage = new BitmapImage(new Uri(@"Images/Oblaka/oblaka_" + String.Format("{0:00000}",imageNumber) + ".png", UriKind.RelativeOrAbsolute));
    myImage.Dispatcher.Invoke(new Action<BitmapImage>(SetImage), bmpImage);
    i++;
    if(i > =numofbmps ) i =0;
    Thread.Sleep(100);
  }
}
Загружать в в другом потоке вызывающим метод UpdateImageThread.
Который затем назначает BitmapImage объекту myImage в его потоке.
Можно сделать и через таймер, и через асинхронный вызов.
При необходимости можно добавлять GC.Collect().
0
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 7
15.10.2014, 17:26  [ТС]
Ругается: "Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток."
в
C#
1
2
3
4
void SetImage(BitmapImage bmpImage)
{
      myImage.Source = bmpImage;
}
т.к. bmpImage принадлежит другому потоку.
Где-то тут ошибка...
0
288 / 251 / 107
Регистрация: 26.10.2012
Сообщений: 796
15.10.2014, 18:13
Я ж написал, что назначение битмэпа должно вызываться через Dispatcher.Invoke контейнера
http://msdn.microsoft.com/ru-r... 10%29.aspx
0
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 7
15.10.2014, 18:45  [ТС]
Вот мой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
using System.Threading;
 
namespace TestApp
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        const int numofbmps = 1493;
 
        public MainWindow()
        {
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Thread t = new Thread(new ThreadStart(UpdateImageThread));
            t.Start();
        }
 
        int ii = 0;
 
        void SetImage(BitmapImage bmpImage)
        {
            imgOblaka.Source = bmpImage;
        }
 
        bool _processImageThread = true;
 
        void UpdateImageThread()
        {
            int i = 0;
            while(_processImageThread )
            {
                var bmpImage = new BitmapImage(new Uri(@"Images/Oblaka/oblaka_" + String.Format("{0:00000}",i) + ".png", UriKind.RelativeOrAbsolute));
                this.Dispatcher.Invoke(new Action<BitmapImage>(SetImage), bmpImage);
                i++;
                if(i >= numofbmps ) i = 0;
                Thread.Sleep(40);                
            }
        }
 
        private void Window_Closed(object sender, EventArgs e)
        {
            _processImageThread = false;
        }
    }
}
Или я туплю...
0
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 7
21.10.2014, 10:10  [ТС]
Разобрался. Надо было "замороженную" bmpImage (bmpImage.Freeze() передавать в основной поток. Тогда работает... Но imgOblaka (Image на форме) не обновляется. Видать не успевает, как ей уже другой Source задают.
Может кто подскажет как сделать, чтобы после смены Source подождать пока картинка прорисуется? Я с WPF связался недавно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.10.2014, 10:10
Помогаю со студенческими работами здесь

количество кадров в секунду OpenGL
помогите исправить ошибку GLboolean bTimer = 0; GLuint OldTick; // когда был нарисован последний...

скачет количество кадров в секунду
Привет,скажите пожалуйста,что такое. Ставлю 25 fps , импортирую avi с таким же количеством кадров в секунду. сверху вставляю текст. но...

Добавить в анимацию больше кадров
Есть одна программа. В ней все хорошо но нужно чтобы было идеально. А чтобы этого достичь нужно в анимации добавить больше кадров. как в...

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

Мониторинг робочего стола. Количество кадров в секунду (FPS)
ребята помогите! Нужно организовать в интерфейсе программы мониторинга удаленным рабочим столом возможность менять количество получаемых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru