Подтвердить что ты не робот

Создание анимированного gif из набора jpeg-изображений

Мне нужно что-то, что может быть написано на окнах 7. Это изображение будет использоваться в баннерах.

4b9b3361

Ответ 1

Вы можете сделать это с помощью ffmpeg

Сначала конвертируйте изображения в видео:

ffmpeg -f image2 -i image%d.jpg video.avi

(Это преобразует изображения из текущего каталога (с именем image1.jpg, image2.jpg...) в видеофайл с именем video.avi.)

Затем преобразуем avi в gif:

ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif

Вы можете получить двоичные файлы для ffmpeg здесь.


Вы также можете сделать аналогичную вещь с mplayer. См. Кодирование из нескольких файлов входных изображений.

Я думаю, что в командной строке было бы что-то вроде:

mplayer mf://*.jpg -mf w=800:h=600:type=jpg -vf scale=160:120 -vo gif89a:fps=3:output=out.gif

(где 800 и 600 - ширина и высота вашего источника, а 160 и 120 - ширина и высота цели .out.gif - это имя вашего целевого файла)


Я только что протестировал их оба, и оба они отлично работают. Однако я получил намного лучшие результаты от mplayer, поскольку мне удалось указать разрешение и частоту кадров. Ваше возражение может измениться, и я уверен, что вы могли бы найти больше опций для ffmpeg, если бы посмотрели.

Ответ 2

ответ Саймона П Стивенса почти заставил меня:

ffmpeg -f image2 -i image%d.jpg video.avi
ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif

Посмотрим, сможем ли мы это сделать.

Пройти через avi не нужно. A -pix_fmt of rgb24 недопустим, а параметр -loop_output предотвращает цикл, который я не хочу. Получаем:

ffmpeg -f image2 -i image%d.jpg out.gif

Мои входные изображения помечены нумерованным 3-значным числом, и у меня их 30 (image_001.jpg, image_002.jpg,...), поэтому мне нужно исправить спецификатор формата

ffmpeg -f image2 -i image_%003d.jpg out.gif

Мои входные изображения с моей камеры телефона, они слишком большие! Мне нужно уменьшить их.

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299 out.gif

Мне также нужно вращать их на 90 градусов по часовой стрелке

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299,transpose=1 out.gif

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

ffmpeg -f image2 -framerate 9 -i image_%003d.jpg -vf scale=531x299,transpose=1 out.gif

Изображение просто слишком большое, поэтому я вырезаю 100 пикселей неба. Транспозиция делает это сложным, я использую пост-повернутые значения x и y:

ffmpeg -f image2 -framerate 9 -i image_%003d.jpg -vf scale=531x299,transpose=1,crop=299,431,0,100 out.gif

Конечный результат - я могу поделиться своим миром удивительным выражением лица с миром:

Example of an animated gif created with ffmpeg

Ответ 3

С ImageMagick:

convert *.png a.gif

Ответ 4

Работала ffmpeg до .avi и .avi до .gif, но единственное, что нужно отметить заключается в том, что ваши изображения должны быть названы в совершенном числовом порядке для работы без пробелов. Я подготовил быстрый python script, чтобы переименовать все мои изображения соответственно, чтобы этот рецепт ffmpeg работал:

import os

files = [ f for f in os.listdir('.') if os.path.isfile(os.path.join('.',f)) and f.endswith('.jpg') ]
for i, file in enumerate(sorted(files)):
    os.rename(file, 'image%03d.jpg' % i)

И затем я наткнулся на гораздо более простой подход, чем ffmpeg для выполнения преобразования, которое просто использует средство преобразования командной строки ImageMagick, подобное этому

convert image%03d.jpg[0-198] animated_gif.gif

Не намного проще, чем эти люди.

Вот здесь: https://gist.github.com/3289840

Ответ 5

Основываясь на ответах Саймона П Стивенса и dwurf, я придумал это упрощенное решение:

ffmpeg -f image2 -framerate 1 -i image%d.jpg video.gif

Это приводит к скорости 1 секунду на изображение. Отрегулируйте значение framerate в соответствии с вашими потребностями.