Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Графика » Как массово разбить гифки на 4-5 img-картинки?

Модерирует : Ausw

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Hjkma

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В общем, есть папка с гифками, мне нужно их разбить на 4-5 img-картинки по каждой гифке, причем не вручную поштучно, а в автоматическом режиме, т. к. гифок более тысячи. Есть такая программа/сервис, которая это позволяет? Подскажите пожалуйста.
 
P.S. IrfanView и GifSplitter уже пробовал, не подходят, они позволяют провести данную операцию только по одной гифке за один раз, а мне нужна программа, которая делает это массово с тысячами гифками.

Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 21:53 04-03-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma

Цитата:
их разбить на 4-5 img-картинки по каждой гифке,

сохранить покадрово? а если там "неподходящее" количество кадров?

Всего записей: 16419 | Зарегистр. 20-09-2014 | Отправлено: 23:00 04-03-2015
Hjkma

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
сохранить покадрово? а если там "неподходящее" количество кадров?  

Покадрово не нужно. Нужно чтобы сохраняло 4-5 картинок из гифки. То есть, 1 gif > 4-5 img. Не важно сколько кадров есть в гифке, 10 или 100, нужны 4-5 картинок. Или хотя бы 20 процентов от количества кадров в гифке.  

Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 00:03 05-03-2015 | Исправлено: Hjkma, 00:06 05-03-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma

Цитата:
10 или 100, нужны 4-5 картинок

случайно или первые ? лучше объясните зачем это нужно.
сделать какой то упрощенную превьюшку?

Всего записей: 16419 | Зарегистр. 20-09-2014 | Отправлено: 04:37 05-03-2015
Hjkma

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
случайно или первые ? лучше объясните зачем это нужно.
сделать какой то упрощенную превьюшку?

Нужны не в случайном порядке или первые, а 4-5 кадров, которые образуют собой слайды в последовательном порядке. То есть, в гифке имеется 25 кадров, от них нужно оставить 4, 8, 12, 16 и 20 кадры. Где-то так.  
 
Добавлено:
А прочем кажется нашел сервис, который разделяет гифки на кадры и отправляет их пользователю в виде архива с кадрами. Причем главное отличие от других подобных сервисов в том, что он делает это сразу с сотнями гифками, а не поштучно. Вот этот сервис: animizer.net/ru  
 
Но проблема в том, что он разбивает гифки на все кадры, а не оставляет от них всего 4-5 кадров. То есть, если в гифке 100 кадров, то он и разделит на 100 img-картинков.  
 
Впрочем, проблему можно решить, если предварительно какой-нибудь программой сократить количество кадров в гифках до 4-5. И потом "скормить" эти гифки этому сайту.  
 
Кто нибудь знает такие программы, которые сокращают число кадров в гифках, причем в массовом режиме?

Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 20:38 05-03-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma
прямо вот под такие требования не видел ничего, но.. как вариант - есть утилиты командной строки, что сохраняют кадры. далее нужно написать скрипт на чем либо, чтобы он распаковывал все кадры и лишь удалял ненужные.
 
к примеру - ImageMagik позволяет сделать так
 
convert animation.gif target.png
 
и появятся файлы target0.png, target1.png и так далее.
после этого нужно лишь удалить ненужные.
 
а "скормить" утилите все гифы в папке - не так сложно.
 
или вот так
http://www.imagemagick.org/discourse-server/viewtopic.php?t=24010
http://unix.stackexchange.com/questions/89242/remove-nth-frames-of-a-gif-remove-a-frame-every-n-frames
 
ps: лучше вам подскажут, в случае Windows, конечно тут Задачи на bat-файлах 11
 
 

Всего записей: 16419 | Зарегистр. 20-09-2014 | Отправлено: 23:23 05-03-2015 | Исправлено: Mavrikii, 01:03 06-03-2015
Hjkma

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, спасибо за помощь. Только правда в этом я ничего не понимаю.

Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 01:31 06-03-2015 | Исправлено: Hjkma, 01:31 06-03-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma
вот, набросал.. путь через одно место, так как не пишу используя batch, но сдается мне что есть кое что лучше  
script.bat

Код:
@echo off
 
setlocal enabledelayedexpansion
set path=D:\portable\ImageMagick;%path%
set tmpFolder=tmp\
set /a keepFiles=4
REM к сожалению batch оперирует только с целыми числами, поэтому придется использовать кое что  
set JScall=Cscript /nologo eval.vbs
 
for %%f in (gifs\*.gif) do (
  REM очищаем временную папку
  del %tmpFolder%*.png /s /f /q >nul 2>&1
  REM распаковываем gif файл покадрово в нее
  convert -coalesce "%%f" %tmpFolder%frame-%%03d.png
  REM подсчитываем и удаляем ненужные файлы
  set cnt=0
  for %%a in (%tmpFolder%*.png) do set /a cnt+=1
  for /f "delims=" %%a in ('%JScall% "Int(!cnt!/%keepFiles%)"') do @set /a step=%%a
  REM шаг для кадров содержится в переменной %step%, удаляем все остальные файлы
  set cnt=!step!
  for %%a in (%tmpFolder%*.png) do (
      if !cnt! neq !step! (
            del %%a
       ) else (
          set /a cnt=-1
       )
         set /a cnt+=1
  )
  REM объединяем файлы обратно  
  for %%a in (%%f) do set filename=%%~nxa
  convert -delay 20 "%tmpFolder%*.png" "gifs2\!filename!"
)
endlocal

в той же папке файл eval.vbs

Код:
WScript.Echo Eval(WScript.Arguments(0))

 
Путь "D:\portable\ImageMagick" - пусть к скаченной ImageMagick (бесплатная утилита с командной строкой)
http://www.imagemagick.org/script/binary-releases.php#windows
 
Оригинальные гифы в папке gifs, результат будет в папке gifs2 (создать изначально), ну и нужно создать временную папку tmp.
 
Да, тут сбивается задержка между кадрами, так как ставится фиксированная вручную -delay 20 и размер конечного гифа будет немаленький, так как кадры сохраняются целиком, а не только изменения.  
 
Но есть еще вот, думаю ею можно сделать короче и быстрее
http://www.lcdf.org/gifsicle/
 
 
как пример (Было - стало)
     


Всего записей: 16419 | Зарегистр. 20-09-2014 | Отправлено: 01:35 06-03-2015 | Исправлено: Mavrikii, 01:39 06-03-2015
Hjkma

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подробнее...

Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 01:46 06-03-2015 | Исправлено: Hjkma, 03:08 06-03-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma

Цитата:
Переустановил ImageMagick, выбрав в установках все компоненты и теперь батник заработал

достаточно было скачать portable версию, без установки.
 

Цитата:
Может в гифках какая-то ошибка или неправильные данные?  

посмотрите, не должно.  
 
ps: вот вам как вариант для другой упомянутой утилиты выше
http://www.lcdf.org/gifsicle/

Код:
@echo off
 
setlocal enabledelayedexpansion
set path=D:\portable\gifsicle;%path%
set /a keepFiles=4
set tmpFolder=tmp\
 
REM к сожалению batch оперирует только с целыми числами, поэтому придется использовать кое что  
set JScall=Cscript /nologo eval.vbs
 
for %%f in (gifs\*.gif) do (
  REM узнаем количество кадров
  for /f "delims=" %%a in ('gifsicle -I "%%f" ^| find /c "+"') do @set /a frames=%%a
  REM выбираем кадры которые нужно оставить
  for /f "delims=" %%a in ('%JScall% "Int(!frames!/%keepFiles%)"') do @set /a step=%%a
  for %%a in (%%f) do set filename=%%~nxa
  REM удаляем все остальные кадры
  set numbers=
  set /a cnt=!step!
  set /a frames-=1
  gifsicle --unoptimize "%%f" -o "%tmpFolder%tmp.gif"
  for /l %%a in (0,1,!frames!) do (
     if !cnt! neq !step! (
        set "numbers=!numbers!^"#%%a^" "
        set /a cnt+=1
      ) else (
        set /a cnt=0
     )
  )
  gifsicle -b "%tmpFolder%tmp.gif" --delete !numbers! -O1 -o "gifs2\!filename!"
)
endlocal

 
сначала убирает оптимизацию с gif файла (тогда безопасно удалять кадры) в tmp папку, зачем удаляет кадры (оставляя первый и отсчитывая от него), после чего сохраняет оптимизированный gif в gifs2. Так как задержка при этом не меняется - скорость воспроизведения остается той же (то есть очень быстро анимировано).

Всего записей: 16419 | Зарегистр. 20-09-2014 | Отправлено: 03:09 06-03-2015 | Исправлено: Mavrikii, 18:27 06-03-2015
Hjkma

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
посмотрите, не должно.  

проверьте сами. откройте тот сайт, ссылка выше. выберите пункт "разбить анимацию", залейте туда переработанные файлы. Мне тот сайт выдает только первые frames. Оригинальные гифки идут без проблем.
Кстати, в папке tmp обнаружил покадровые png файлы. А может переработать скрипт таким образом, чтобы только распаковал 4 кадров, а не собирал из них gif? Это возможно?

Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 03:16 06-03-2015 | Исправлено: Hjkma, 03:19 06-03-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma

Цитата:
чтобы только распаковал 4 кадров, а не собирал из них gif? Это возможно?

для того, чтобы удалить, нужно все равно "распаковывать" все - вы не понимаете как гиф работает. для оптимизации у него есть основной кадр, остальные кадры - лишь те области, что меняются. за счет этого и получается размер меньше.
если сохранить только их, то получится просто цветной мусор на картинке.
 
я написал код, поковыряйтесь. на дальнейшее, к сожалению, у меня нет времени.
 
ps: второй вариант на том сайте показывается анимированным.
у первого метода - возможно ImageMagik что то не до конца оптимизирует, нужно поиграться с этим
http://www.imagemagick.org/Usage/anim_opt/#optimize
 
а результат второго кода (я там исправил одну цифру) выглядит так
   
если хочется добавить задержку, то добавить аргумент -d20 (или с иной цифрой) к последнему вызову утилиты

Цитата:
-d time
--delay time
Set the delay between frames to time in hundredths of a second.  

 

Код:
 gifsicle -b "%tmpFolder%tmp.gif" -d20 --delete !numbers! -O1 -o "gifs2\!filename!"

Всего записей: 16419 | Зарегистр. 20-09-2014 | Отправлено: 03:20 06-03-2015 | Исправлено: Mavrikii, 04:05 06-03-2015
Hjkma

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Второй вариант это с Gifsicle? Спасибо за помощь, попробую поработать с этой утилитой.

Всего записей: 242 | Зарегистр. 04-03-2015 | Отправлено: 03:29 06-03-2015
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Графика » Как массово разбить гифки на 4-5 img-картинки?


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru