GIF-эффект ImageMagick с меньшим количеством кадров - PullRequest
0 голосов
/ 26 октября 2018

Возможная история для этого вопроса: Устранить фактор медленной скорости в командах ffmpeg и image-magic

Я создаю GIF, используя эту команду с эффектом очистки,

convert -gravity southeast logo.png  -write MPR:logo \
  \( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
  \( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after  \) \
  -delete 0--1                                           \
  MPR:before  \( MPR:after  -set delay 25 -crop 15x0 -reverse     \) \
  MPR:after   \( MPR:before -set delay 27 -crop 15x0   \) \
  -set delay 2 -loop 0 temp.gif -delete 1--1 -resize 640x thumb.jpg

Работает нормально, но создает GIF размером 3 МБ +, так как эффект очистки более 100 кадров.

Как мы можем уменьшить количество кадров для эффекта стеклоочистителя, а качество остается прежним, но размер уменьшается? Я пытался прикрепить разные параметры с разными значениями цикла, но ничего не получалось.

1 Ответ

0 голосов
/ 26 октября 2018

Вот 3 команды Imageamagick. Первый твой выше. Во втором я создаю общее изображение карты цветов из двух входных изображений (до и после) и применяю это к каждому кадру. В третьем я делаю ту же обработку цветовой карты, но уменьшаю количество кадров. Я взял все изображения с веб-сайта и ссылки на анимацию и поместил новый логотип в нижнем левом углу, так как в правом нижнем углу уже был один. Обратите внимание, что я добавил -layers оптимизации для всех, что значительно уменьшило размер файла.

логотип

enter image description here

перед:

enter image description here

после

enter image description here

Метод 1 (оригинал):

convert -gravity southwest everlogo.png -write MPR:logo \
\( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
\( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after \) \
-delete 0--1 \
MPR:before \( MPR:after -set delay 25 -crop 15x0 -reverse \) \
MPR:after \( MPR:before -set delay 27 -crop 15x0 \) \
-set delay 2 -layers optimize -loop 0 temp1a.gif
2,246,665 bytes
174 frames


Результат слишком велик для загрузки здесь.

Метод2 (общая цветовая карта):

convert -gravity southwest \
everlogo.png -write MPR:logo +delete \
\( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
\( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after \) \
-delete 0--1 \
\( MPR:before MPR:after +append +dither -colors 255 -unique-colors -write MPR:colors +delete \) \
MPR:before +dither -remap MPR:colors \( MPR:after +dither -remap MPR:colors -set delay 25 -crop 15x0 -reverse \) \
MPR:after+dither -remap MPR:colors \( MPR:before +dither -remap MPR:colors -set delay 27 -crop 15x0 \) \
-set delay 2 -layers optimize -loop 0 temp1b.gif
2,004,345 bytes
173 frames


enter image description here

Метод 3 (общая цветовая карта; удвоенная ширина кадрирования и четырехкратная задержка; отрегулируйте задержку по своему усмотрению, чтобы она лучше соответствовала Способу 2)

convert -gravity southwest \
everlogo.png -write MPR:logo +delete \
\( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
\( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after \) \
-delete 0--1 \
\( MPR:before MPR:after +append +dither -colors 255 -unique-colors -write MPR:colors +delete \) \
MPR:before +dither -remap MPR:colors \( MPR:after +dither -remap MPR:colors -set delay 100 -crop 30x0 -reverse \) \
MPR:after+dither -remap MPR:colors \( MPR:before +dither -remap MPR:colors -set delay 108 -crop 30x0 \) \
-set delay 4 -layers optimize -loop 0 temp1c.gif
1,927,359 bytes
87 frames


enter image description here

Я немного удивлен, что столь значительное уменьшение количества кадров не приводит к соразмерному уменьшению размера файла анимации. Но я подозреваю, что это связано с оптимизацией слоев.

Сложение:

Кроме того, во всем приведенном выше коде я не понимаю, как установить задержку 25 и 27 в скобках, а затем снова установить ее на 2. Я не думаю, что анимационные картинки могут иметь разные задержки. Единственное, что имеет значение, это последний.

Так что с точки зрения задержек и количества кадров, эти два делают то же самое. Первый использует -crop 15x0 и -set delay 4, а второй использует -crop 30x0 и -set delay 8. Это создает анимацию с той же скоростью, но у второго меньше кадров. Первый - 174, второй - 88 и более грубых шагов. Но размеры файлов примерно одинаковы. Таким образом, похоже, что общая цветовая карта вызывает наибольшее уменьшение размера файла.

convert -gravity southwest everlogo.png -write MPR:logo \
\( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
\( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after \) \
-delete 0--1 \
MPR:before \( MPR:after -crop 15x0 -reverse \) \
MPR:after \( MPR:before -crop 15x0 \) \
-set delay 4 -layers optimize -loop 0 temp3.gif
frames 174
2,246,665 bytes


convert -gravity southwest everlogo.png -write MPR:logo \
\( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
\( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after \) \
-delete 0--1 \
MPR:before \( MPR:after -crop 30x0 -reverse \) \
MPR:after \( MPR:before -crop 30x0 \) \
-set delay 8 -layers optimize -loop 0 temp2.gif
frames 88
2,174,954 bytes


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...