2013-08-12 3 views
10

У меня есть каталог с изображениями, которые я хочу превратить в gif.imagemagick конвертировать отдельные задержки кадра в gif

Каждое имя файла следует этой схеме: <zero_padded_index>_<delay_in_milliseconds>.gif

Пример:00001_1432.gif

я могу создать GIF анимацию с ImageMagick: convert -loop 0 -delay 10 *.gif out.gif

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

convert -delay 0 -loop 0 *.gif output.gif 

for gif in *.gif; do 

    name=${gif%.gif} 
    index=$(echo ${name%-*} | sed 's/0*//') 
    delay=${name#*-} 

    # 1. convert milliseconds to w/e imagemagick -delay uses. 
    # 2. update the frame at the correct index. 

done; 

Я постепенно наращиваю gif? Или вернуться и изменить их после факта? Мои отбивные imagemagick не соответствуют номиналу.

+1

[Не разбирайте вывод 'ls'] (http://mywiki.wooledge.org/ParsingLs), вместо этого вы можете использовать globbing:' для gif_file in * .gif; делать [...]; done'. Также укажите свои переменные. 'cut' также не требуется, вы можете использовать подстановку параметров для одной и той же задачи. –

ответ

13

Так что если я приближался к этой проблеме я бы сделать следующее (если я правильно понимаю)

Учитывая следующие файлы:

[[email protected] ~]# ls -lta so/ 
total 728 
drwxr-xr-x 2 root root 4096 Aug 13 18:35 . 
dr-xr-x---. 17 root root 4096 Aug 13 18:35 .. 
-rw-r--r-- 1 root root 18933 Aug 13 18:23 00007_1432.gif 
-rw-r--r-- 1 root root 18594 Aug 13 18:23 00006_1432.gif 
-rw-r--r-- 1 root root 18984 Aug 13 18:23 00005_1432.gif 
-rw-r--r-- 1 root root 19601 Aug 13 18:23 00004_1444.gif 
-rw-r--r-- 1 root root 19408 Aug 13 18:23 00003_1432.gif 
-rw-r--r-- 1 root root 18632 Aug 13 18:23 00002_1552.gif 
-rw-r--r-- 1 root root 20104 Aug 13 18:23 00001_1432.gif 
[[email protected] ~]# 

Мой сценарий будет выглядеть следующим образом:

#!/bin/bash -x 

# directory of the individual gifs 
_dir=/root/so/ 

# get gifs and make sure your sort them in order 
gifs=$(find $_dir -name *.gif|sort|xargs) 

# this is going to be the imagemagick command 
_CONVERT="convert " 

# make sure the list of gifs look correct 
echo $gifs 

for gif in $gifs; do 

    # full path of each gif 
    full_path=$gif 

    # get just the name of the gif (originally I was going to use this if everything was happing within the same directory) 
    name=$(echo ${gif##*/}) 
    #echo -e "\n$name" 

    # Get the index 
    index=$(echo ${gif##*/} | cut -d\_ -f1) 
    #echo -e "\n$index" 

    # Get the delay of the current image 
    delay=$(echo ${gif##*/} | cut -d\_ -f2| sed "s,.gif,,") 
    # echo -e "\n$delay" 

    # add correct delay options to current gif, append to existing command 
    _CONVERT="${_CONVERT} -delay $delay $gif " 

done; 

# add the outpt of where you're going to put your gif 
_CONVERT="${_CONVERT} -loop 0 -layers Optimize /root/so/stackoverflow.gif" 

# show full command 
echo "Convert cmd: $_CONVERT" 

# run it, then go get your image 
eval $_CONVERT 

Пример генерируемой команды:

Convert cmd: convert -delay 1432 /root/so/00001_1432.gif -delay 1552 /root/so/00002_1552.gif -delay 1432 /root/so/00003_1432.gif -delay 1444 /root/so/00004_1444.gif -delay 1432 /root/so/00005_1432.gif -delay 1432 /root/so/00006_1432.gif -delay 1432 /root/so/00007_1432.gif -layers Optimize /root/so/stackoverflow.gif 

Надеюсь, это то, что вы ищете.

+2

Это замечательно, спасибо! –

+0

Рад, что я мог помочь !!! –

+1

Спасибо за скрипт. Я получил ошибку в поиске, мне пришлось добавить цитаты. Ср http://stackoverflow.com/a/6495536/113305 – Manu

 Смежные вопросы

  • Нет связанных вопросов^_^