Как создать анимированное GIF-изображение из нескольких изображений PNG? - PullRequest
1 голос
/ 04 июня 2019

У меня есть файл изображения "image.png", из которого я хотел создать изображение .gif. Я написал небольшой скрипт, чтобы получить 100 изображений разного размера (1% - 100%) этого изображения, затем я удалил исходное изображение (image.png) из содержащей его папки и использовал эту команду для создания изображения GIF I хотел:

convert -delay 10 -loop 0 *.png image.gif

Когда я проверял изображение в формате gif, я мог видеть самое большое изображение (размер 100%) как неподвижное изображение (для моих глаз), и меньшие изображения начали появляться в верхнем левом углу изображения с 1%. - 100%, при этом изображение 100% совпадает с исходным изображением, которое всегда отображается. Я ожидал, что изображение увеличится в размерах от центра прямоугольника / квадрата в программном обеспечении изображения (gthumb), которое я использую, но это не то, что я получаю?

Я проверил изображения меньшего размера, и они в порядке, и я также запустил слайд-шоу с изображениями с высокой скоростью и показал мне, что я ожидал увидеть в своем GIF-файле. Я использую Linux.

Обновление 1: Вот скрипт, который я использовал для генерации 100 изображений перед ответом Марка Сетчелла:

#!/bin/bash
for i in {1..100};
do
if [ $i -lt 10 ]; then
convert -resize $i% lena.png 00$i.png
elif [ $i -lt 100 ]; then
convert -resize $i% lena.png 0$i.png
else
convert -resize $i% lena.png $i.png
fi
done

, который произвел 100 изображений. Затем, согласно ответу «Марк Сетчелл», я использовал этот код:

for ((i=0;i<100;i++)) ; do
   convert checked-box.png -resize $i% -background none -gravity center -extent 512x512 miff:-
done | convert miff:- -delay 80 anim.gif

здесь - это результат, который я получил. И это lena.png , который я использовал.

Обновление 2:

Я изменил следующую команду, чтобы изменить имя входного файла.

for ((i=0;i<100;i++)) ; do
       convert lena.png -resize $i% -background none -gravity center -extent 512x512 miff:-
    done | convert miff:- -delay 80 anim.gif

1 Ответ

1 голос
/ 10 июня 2019

Полагаю, вы хотите что-то вроде следующего.Я избегаю записи всех 100 промежуточных файлов на диск, а вместо этого записываю их в потоковом формате ( MIFF или Magick Image File Format ) в окончательный convert, который собирает их все иоживляет их.Еще один «трюк» - центрировать каждое изображение на прозрачном фоне (-background none), чтобы все кадры GIF были одинакового размера.

for ((i=0;i<100;i++)) ; do
   convert lena.png -resize $i% -background none -gravity center -extent 512x512 miff:-
done | convert miff:- -delay 80 anim.gif

enter image description here


Обратите внимание, что параметр -extent определяет размеры конечного изображения.Если вы сделаете экстент меньше, чем исходное изображение, вы получите увеличение, превышающее 1: 1 в полном размере.Полагаю, вы , вероятно, хотите, чтобы экстент точно совпадал с вашим входным изображением, тогда последним кадром анимации будет ваше полное, необрезанное, исходное изображение.Но теперь у вас есть код, поэтому экспериментируйте!

Обратите внимание, что вы можете запустить анимацию в обратном направлении и создать эффект сжатия вместо масштабирования, выполнив цикл назад от 100 до 1 или добавив -reverseдо -delay, чтобы изменить порядок кадров.


Ключевые слова : ImageMagick, изображение, обработка изображений, масштабирование, сжатие, GIF, анимированный GIF, командная строка

...