Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 14
1

Задержка кадров анимации gif

12.02.2015, 12:02. Показов 2010. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я недавно начал изучать си++.. Требуется программа, входными данными которой является gif анимация. Из неё извлекаются значения задержки, модифицируются. Выходные данные gif анимация с новыми задержками.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2015, 12:02
Ответы с готовыми решениями:

Чтение файла GIF. Перевод текста в HEX. Декодирование GIF анимации
Всем привет.. задача такая: Необходимо открыть файл GIF.. Например, как в этой статье про...

Builde C++, вставка GIF анимации.
Можно ли каким-либо образом вставить на форму GIF анимашку?

Количество кадров анимации GIF
Всем доброго времени суток. Как получить список кадров gif-ки?

Генерация GIF-анимации из кадров
Доброго времени суток! Хочу сделать анимационный GIF. В интернете нет на русском подробного...

8
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
12.02.2015, 19:07 2
Попробуй GDI+ класс Image. Задержки наверное можно получить через Image.GetAllPropertyItems , а кадры через Image.SelectActiveFrame. Надо экспериментировать.
0
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 14
26.02.2015, 22:19  [ТС] 3
upup
0
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
27.02.2015, 03:57 4
Нашаманил говнокод с GIF89a.

>program source dest delay

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <cstdlib>
#include <cstring>
#include <cstdint>
#include <cmath>
#include <vector>
#include <sstream>
#include <stdexcept>
 
using namespace std;
 
namespace
{
   const uint8_t extension_introducer = 0x21 ;
   const uint8_t graphic_control_label = 0xF9 ;
   const uint8_t block_terminate = 0x00 ;
   const uint8_t comment_label = 0xFE ;
   const uint8_t plain_text_label = 0x01 ;
   const uint8_t extension_label = 0xFF ;
   const uint8_t gif_trailer = 0x3B ;
   const uint8_t image_separator = 0x2C ;
}
 
uint16_t delay = 0 ;
 
 
inline char * uint8_to_pchar ( uint8_t * p )
{
   return reinterpret_cast<char*>(p) ;
}
 
 
size_t read_bytes ( std::istream & stream , std::vector<uint8_t> & buffer , size_t read_bytes_count )
{
   buffer.resize(read_bytes_count) ;
   stream.read( uint8_to_pchar(buffer.data()) , read_bytes_count ) ;
   size_t gcount = stream.gcount() ;
   buffer.resize(gcount) ;
   if ( gcount != read_bytes_count )
      throw std::runtime_error ("read file error in [" + std::to_string(stream.tellg()) + "] position") ;
   return gcount ;
}
 
void write_bytes ( std::ostream & stream , std::vector<uint8_t> & buffer  )
{
   stream.write( uint8_to_pchar(buffer.data()) , buffer.size() ) ;
   if ( !stream.good() )
      throw std::runtime_error ("write file error") ;
}
 
 
uint8_t read_extension_introducer ( std::istream & stream , std::vector<uint8_t> & buffer )
{
   std::vector<uint8_t> temp_buffer(255) ;
   read_bytes ( stream , temp_buffer , 1 ) ;
   buffer.insert(buffer.end(),temp_buffer.begin(),temp_buffer.end()) ;
   uint8_t type_block = temp_buffer[0] ;
   switch ( type_block )
   {
      case graphic_control_label :
      {
         read_bytes(stream,temp_buffer,6) ;
         if ( temp_buffer[0] != 4 )
            throw std::runtime_error ( "error: block size failure in graphic_control_label" ) ;
         if ( temp_buffer[5] != block_terminate )
            throw std::runtime_error ( "error: block_terminate failure" ) ;
 
         uint16_t & delay_frame = *reinterpret_cast<uint16_t*>(temp_buffer.data()+2) ;
         delay_frame = delay ; //Задержка
 
         break ;
      }
      case comment_label :
      {
         while ( !stream.eof() )
         {
            read_bytes(stream,temp_buffer,1) ;
            if ( temp_buffer[0]==block_terminate )
               break ;
            buffer.push_back(temp_buffer[0]) ;
         }
         break ;
      }
      case plain_text_label :
      {
         read_bytes(stream,temp_buffer,13) ;
         buffer.insert(buffer.end(),temp_buffer.begin(),temp_buffer.end()) ;
         if ( temp_buffer[0] != 12 )
            throw std::runtime_error ( "error: block size failure in plain_text_label" ) ;
         while ( !stream.eof() )
         {
            read_bytes(stream,temp_buffer,1) ;
            if ( temp_buffer[0]==block_terminate )
               break ;
            buffer.push_back(temp_buffer[0]) ;
         }
         break ;
      }
      case extension_label :
      {
         read_bytes(stream,temp_buffer,12) ;
         buffer.insert(buffer.end(),temp_buffer.begin(),temp_buffer.end()) ;
         if ( temp_buffer[0] != 11 )
            throw std::runtime_error ( "error: block size failure in extension_label" ) ;
         while ( !stream.eof() )
         {
            read_bytes(stream,temp_buffer,1) ;
            if ( temp_buffer[0]==block_terminate )
               break ;
            buffer.push_back(temp_buffer[0]) ;
         }
         break ;
      }
      default:
         throw std::runtime_error ( "error: unknown block" ) ;
   }
   buffer.insert(buffer.end(),temp_buffer.begin(),temp_buffer.end()) ;
   return type_block ;
}
 
void read_image_descriptor ( std::istream & stream , std::vector<uint8_t> & buffer )
{
   std::vector<uint8_t> temp_buffer(9) ;
   read_bytes(stream,temp_buffer,9) ;
   buffer.insert(buffer.end(),temp_buffer.begin(),temp_buffer.end()) ;
}
 
void read_raster_data ( std::istream & stream , std::vector<uint8_t> & buffer )
{
   std::vector<uint8_t> temp_buffer(1024) ;
   read_bytes(stream,temp_buffer,1) ;
   buffer.insert(buffer.end(),temp_buffer.begin(),temp_buffer.end()) ;
   while ( true )
   {
      read_bytes(stream,temp_buffer,1) ;
      uint8_t block_size = temp_buffer[0] ;
      buffer.insert(buffer.end(),temp_buffer.begin(),temp_buffer.end()) ;
      if ( block_size == block_terminate )
         break ;
      read_bytes(stream,temp_buffer,block_size) ;
      buffer.insert(buffer.end(),temp_buffer.begin(),temp_buffer.end()) ;
   }
}
 
int main( int argc , char * argv[] )
{
   if ( argc < 4 )
   {
      std::cerr << "command: source_file_path destinate_file path delay_time" ;
      return EXIT_FAILURE ;
   }
 
   std::stringstream ss(argv[3]) ;
   ss >> delay ;
 
   std::string in_path (argv[1]) ;
   std::string out_path (argv[2]) ;
   std::ifstream in_file ( in_path , std::ios::binary ) ;
   std::ofstream out_file ( out_path , std::ios::binary ) ;
 
   if ( !in_file.is_open() )
   {
      std::cerr << "Error: can not open file " << in_path << std::endl ;
      return EXIT_FAILURE ;
   }
   if ( !out_file.is_open() )
   {
      std::cerr << "Error: can not open file " << out_path << std::endl ;
      return EXIT_FAILURE ;
   }
   std::vector<uint8_t> result_buffer ;
   std::vector<uint8_t> buffer(255) ;
   try
   {
      read_bytes(in_file,buffer,13) ;
      result_buffer.insert(result_buffer.end(),buffer.begin(),buffer.end()) ;
      if ( memcmp(buffer.data(),"GIF89a",6) )
      {
         std::cerr << "Error: GIF Data Stream is not GIF89a" << std::endl ;
         return EXIT_FAILURE ;
      }
 
      bool global_color_table_flag = buffer[10] & 1<<(sizeof(uint8_t)-1) ;
 
 
 
      if ( global_color_table_flag )
      {
         uint8_t size_of_global_color_table = buffer[10] & 0x7 ;
         size_t global_color_table_bytes = 3 * pow(2,size_of_global_color_table+1) ;
         read_bytes(in_file,buffer,global_color_table_bytes) ;
         result_buffer.insert(result_buffer.end(),buffer.begin(),buffer.end()) ;
      }
      bool reading = true ;
      while ( reading )
      {
         read_bytes(in_file,buffer,1 ) ;
         uint8_t type = buffer[0] ;
         result_buffer.insert(result_buffer.end(),buffer.begin(),buffer.end()) ;
         buffer.clear() ;
         switch (type)
         {
            case extension_introducer :
            {
               read_extension_introducer(in_file,buffer) ;
               break ;
            }
            case image_separator :
            {
               read_image_descriptor(in_file,buffer) ;
               result_buffer.insert(result_buffer.end(),buffer.begin(),buffer.end()) ;
               if ( buffer.back() & (1<<(sizeof(uint8_t)-1)) )
               {
                  read_bytes(in_file,buffer,3*pow(2,(buffer.back()&0x7)+1)) ;
                  result_buffer.insert(result_buffer.end(),buffer.begin(),buffer.end()) ;
               }
               buffer.clear() ;
               read_raster_data(in_file,buffer) ;
               result_buffer.insert(result_buffer.end(),buffer.begin(),buffer.end()) ;
               buffer.clear() ;
               break ;
            }
            case gif_trailer :
               std::cout<<"Reading end"<<std::endl ;
               reading = false ;
               break ;
         }
         result_buffer.insert(result_buffer.end(),buffer.begin(),buffer.end()) ;
      }
 
 
 
      write_bytes (out_file,result_buffer ) ;
   } catch ( const std::runtime_error & e )
   {
      std::cerr << e.what() << std::endl ;
   }
}
Не без ошибок, но для примера подойдет.
Описание GIF89a - http://www.martinreddy.net/gfx/2d/GIF89a.txt

Кликните здесь для просмотра всего текста


Добавлено через 11 минут
Исправил баг с локальной палитрой.
1
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 14
27.02.2015, 15:39  [ТС] 5
Здорово))) Что я делаю не так? Я делаю билд в Visual Studio.. а далее?
0
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
27.02.2015, 15:43 6
Цитата Сообщение от sckorpions Посмотреть сообщение
а далее?
вызов с параметрами:
>program.exe файл_источник файл_приемник новая задержка
допустим, myprog.exe input.gif output.gif 50
1
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 14
27.02.2015, 17:19  [ТС] 7
Великолепно, я осознал. Подскажите, что где изменять, для изменения задержки каждого кадра индивидуально(по алгоритму). И возможен ли запуск через оболочку winform, ну или для начала консоли? Не прошу переделывать, просто подскажите где искать)) Ибо с запуском через cmd с параметрами сталкиваюсь впервые
0
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
27.02.2015, 18:42 8
Цитата Сообщение от sckorpions Посмотреть сообщение
Не прошу переделывать, просто подскажите где искать))
В функции read_extension_introducer
C++
1
delay_frame = delay ; //Задержка
При считывании для каждого кадра выставляется одинаковая задержка. Можете переделать.

Но переделать всё-таки нужно в более читабельный и гибкий вид.
0
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 14
27.02.2015, 18:48  [ТС] 9
Если честно, 90% кода я не понимаю, слишком он сложен для меня (только начал изучать плюсы, до этого пол года изучал шарп). Наверное понимание дико усложняет обработка ошибок, ибо с ней еще не сталкивался в плюсах. Будем разбирать, спасибо)
0
27.02.2015, 18:48
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.02.2015, 18:48
Помогаю со студенческими работами здесь

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

Задержка анимации
Как задать задержку между анимацией? ну чтоб слово мелькало через каждые 3 секунды? ...

Задержка анимации
Доброго времени. У меня проблема с анимацией 2D персонажа. Опаздывает проигрывание анимации вот...

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Обработка числовой информации
hw_wired 28.01.2025
Введение в обработку числовой информации В современном мире обработка числовой информации стала неотъемлемой частью как профессиональной деятельности, так и повседневной жизни. Электронные таблицы. . .
Мультимедиа
hw_wired 28.01.2025
Введение в мультимедийные технологии В современном мире мультимедийные технологии стали неотъемлемой частью нашей жизни, проникнув во все сферы человеческой деятельности. Термин "мультимедиа". . .
Обработка текстовой информации
hw_wired 28.01.2025
Введение в обработку текстовой информации В современном мире обработка текстовой информации играет фундаментальную роль в различных сферах человеческой деятельности. Текстовые редакторы стали. . .
Обработка графической информации
hw_wired 28.01.2025
Введение в компьютерную графику Компьютерная графика стала неотъемлемой частью современного цифрового мира, пройдя впечатляющий путь развития от простейших черно-белых изображений до сложных. . .
Python в Алгоритмике: Решение задач
hw_wired 28.01.2025
Введение в Python и Алгоритмику В современном мире программирование стало неотъемлемой частью образования и профессионального развития. Python зарекомендовал себя как один из самых популярных и. . .
Компьютер как универсальное устройство для работы с информацией
hw_wired 28.01.2025
Введение в устройство компьютера Компьютер представляет собой универсальное электронное устройство, предназначенное для автоматической обработки информации. В современном мире компьютер стал. . .
Информация и информационные процессы
hw_wired 28.01.2025
Понятие информации и ее виды В современном мире информация является одним из фундаментальных понятий, пронизывающих все сферы человеческой деятельности. Под информацией понимают любые сведения об. . .
Алгоритмика
hw_wired 28.01.2025
Введение: Основы алгоритмики и её роль в информатике В современном мире программирование и алгоритмическое мышление стали неотъемлемой частью образования и профессиональной деятельности. . . .
Информационное моделирование
hw_wired 28.01.2025
Введение в информационное моделирование В современном мире информационное моделирование стало неотъемлемой частью научной, образовательной и профессиональной деятельности. Это мощный инструмент. . .
Объекты и их имена
hw_wired 28.01.2025
Введение: Основы объектного подхода и их роль в информатике В современном мире информационных технологий объектный подход стал фундаментальным принципом организации и обработки информации. Этот. . .
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru