Ru-Board.club
← Вернуться в раздел «Графика»

» Как массово разбить гифки на 4-5 img-картинки?

Автор: Hjkma
Дата сообщения: 04.03.2015 20:53
В общем, есть папка с гифками, мне нужно их разбить на 4-5 img-картинки по каждой гифке, причем не вручную поштучно, а в автоматическом режиме, т. к. гифок более тысячи. Есть такая программа/сервис, которая это позволяет? Подскажите пожалуйста.

P.S. IrfanView и GifSplitter уже пробовал, не подходят, они позволяют провести данную операцию только по одной гифке за один раз, а мне нужна программа, которая делает это массово с тысячами гифками.
Автор: Mavrikii
Дата сообщения: 04.03.2015 22:00
Hjkma

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

сохранить покадрово? а если там "неподходящее" количество кадров?
Автор: Hjkma
Дата сообщения: 04.03.2015 23:03

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

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

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

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

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

Нужны не в случайном порядке или первые, а 4-5 кадров, которые образуют собой слайды в последовательном порядке. То есть, в гифке имеется 25 кадров, от них нужно оставить 4, 8, 12, 16 и 20 кадры. Где-то так.

Добавлено:
А прочем кажется нашел сервис, который разделяет гифки на кадры и отправляет их пользователю в виде архива с кадрами. Причем главное отличие от других подобных сервисов в том, что он делает это сразу с сотнями гифками, а не поштучно. Вот этот сервис: animizer.net/ru

Но проблема в том, что он разбивает гифки на все кадры, а не оставляет от них всего 4-5 кадров. То есть, если в гифке 100 кадров, то он и разделит на 100 img-картинков.

Впрочем, проблему можно решить, если предварительно какой-нибудь программой сократить количество кадров в гифках до 4-5. И потом "скормить" эти гифки этому сайту.

Кто нибудь знает такие программы, которые сокращают число кадров в гифках, причем в массовом режиме?
Автор: Mavrikii
Дата сообщения: 05.03.2015 22:23
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


Автор: Hjkma
Дата сообщения: 06.03.2015 00:31
Mavrikii, спасибо за помощь. Только правда в этом я ничего не понимаю.
Автор: Mavrikii
Дата сообщения: 06.03.2015 00:35
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
Автор: Hjkma
Дата сообщения: 06.03.2015 00:46
[more] Mavrikii
спасибо, теперь попробую разобраться

Добавлено:
Сделал как вы написали, скачал программу, поместил в D:\portable\, создал батник, ввел туда код, создал папки gifs (ввел туда нужные гифки), gifs2, tmp, создал файл eval.vbs, туда поместил код. Запустил батник, появилось коммандное окно, что-то начала исполнять, а потом закрылась. И все. Папка gifs2 пуста. Может что-то еще нужно делать? Или установить какие-нибудь программы?

Добавлено:
Переустановил ImageMagick, выбрав в установках все компоненты и теперь батник заработал. В папке gifs2 гифки появлись, с 4 кадрами. Спасибо, все заработало.

Добавлено:
Опять проблема
Программа закончила работу, на руках оказалось более 100 гифок с 4 fps. Но когда я скормил эти гифки тому сервису, мне этот сайт выдал только первые кадры с каждой гифки, а не все 4! Что делать то? Оригинальные гифки сайт нормально переваривает, выдавая все кадры.
Может в гифках какая-то ошибка или неправильные данные? [/more]
Автор: Mavrikii
Дата сообщения: 06.03.2015 02:09
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
Автор: Hjkma
Дата сообщения: 06.03.2015 02:16

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

проверьте сами. откройте тот сайт, ссылка выше. выберите пункт "разбить анимацию", залейте туда переработанные файлы. Мне тот сайт выдает только первые frames. Оригинальные гифки идут без проблем.
Кстати, в папке tmp обнаружил покадровые png файлы. А может переработать скрипт таким образом, чтобы только распаковал 4 кадров, а не собирал из них gif? Это возможно?
Автор: Mavrikii
Дата сообщения: 06.03.2015 02:20
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!"
Автор: Hjkma
Дата сообщения: 06.03.2015 02:29
Второй вариант это с Gifsicle? Спасибо за помощь, попробую поработать с этой утилитой.

Страницы: 1

Предыдущая тема: Подскажите, какой это шрифт


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.