як я можу змінити розмір анімованого файлу GIF за допомогою ImageMagick?


46

Я хочу змінити розмір такого анімованого файлу GIF do.gif введіть тут опис зображення

Якщо я це зробити, convert do.gif -resize 24x24\! do-24.gifя зміню його розмір у do-24.gif, але не анімованийвведіть тут опис зображення

Як змінити розмір на правильний спосіб отримати ту ж анімацію?

Відповіді:


56

перший запуск:

convert do.gif -coalesce temporary.gif

тоді

convert -size <original size> temporary.gif -resize 24x24 smaller.gif

2
-coalesce"створює повний перегляд анімації в кожній точці, трохи схожа на справжню смужку фільму, а не анімаційну послідовність. Таку послідовність, відому як" Згуртована анімація " , набагато простіше вивчати, редагувати, змінювати та повторно оптимізувати."
сам

28
gifsicle --resize 24x24 > do-24.gifможе і до цього
сам

2
Зауважте, що зведений вигляд набагато більший, ніж оптимізований (у моєму тесті - 3,2 рази), і зміна розміру створює зв'язане зображення, яке також може бути більшим за оригінальний розмір файлу (у моєму тесті 2,3 рази), навіть якщо роздільна здатність менший. Коли я намагаюся змінити розмір прямо, це виглядає чудово і має невеликий розмір файлу, хоча, можливо, це просто працює для цього зображення.
ендоліт

1
gifsicle дала набагато кращий, оптимізований вихід для мого використання. Дякую @sam!
sj26

4
перетворити тимчасовий.gif -розмір 24x24 менший.gif працює для мене., не вказуючи розмір вводу.
AMB

3

-coalesce + -deconstruct

Після -coalesce, ймовірно, ви захочете додати -deconstruct:

convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif

Першопричиною проблеми є те, що ваш GIF введення був мінімізований належним чином: GIF дозволяє зсувом наступного кадру бути лише модифікованим прямокутником від попереднього.

-coalesceпотім розширює всі кадри до початкового розміру, що змушує працювати розмір, але він не повторно стискає кадри як ваше вхідне зображення: -deconstructце потрібно для цього!

Використання даних тесту з цієї відповіді: Як створити анімований gif з нерухомих зображень (бажано за допомогою командного рядка)? ми можемо це чітко бачити з identify:

$ identify out-convert.gif | head -n 3
out-convert.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.020u 0:00.019
out-convert.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019
out-convert.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019

$ convert out-convert.gif -resize 256x out.gif
$ identify out.gif | head -n 3
out.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[1] GIF 256x256 256x256+125+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[2] GIF 256x258 256x256+123+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x out-coalesce.gif
$ identify out-coalesce.gif | head -n 3
out-coalesce.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[1] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[2] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
$ identify out-deconstruct.gif | head -n 3
out-deconstruct.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[1] GIF 135x135 256x256+60+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[2] GIF 135x136 256x256+59+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010

out.gif

введіть тут опис зображення

out-coalesce.gif

введіть тут опис зображення

out-deconstruct.gif

введіть тут опис зображення

По-перше, ми бачимо, як вхідний файл, out-convert.gifнасправді був стиснутий, оскільки кадр 2 лише 516x516зміщений 252+257, тоді як повнорозмірний кадр 1 є 1024x1024.

Потім, якщо порівняти три конверсії:

  • out.gif: Усі кадри є 256x256чи більшими, і величезними приблизно в 5 Мбіт, TODO чому?

    Візуально невірно, оскільки ці приблизно 256x256кадри мають ненульовий зсув, наприклад 125+128для кадру 2!

  • out-coalesce.gif: всі кадри є 256x256і мають правильне зміщення 0+0.

    Вихід виглядає візуально правильним, але розмір вихідного файлу становить 2,0 МіБ, що більше, ніж out-deconstruct.gif

  • out-deconstruct.gif: стислі кадри, кінцевий розмір виводу 1,9 МіБ.

    Не значно менше out-coalesce.gif, але я думаю, що це лише тому, що чорна земля справляється дуже добре, і це може бути дуже значним в цілому.

ffmpeg і gifsicle

Я також випробував наступні команди:

ffmpeg -i out-convert.gif -vf scale=256:-1 out-ffmpeg-small.gif
gifsicle --resize 256x256 out-convert.gif > out-gifsicle.gif

і обидва отримали ще менший правильний вигляд 1,5 МіБ.

Дивіться також: Як створити анімований gif з нерухомих зображень (бажано за допомогою командного рядка)?

TODO: чому вони можуть зробити його меншим, ніж convert? Вони просто вибирають краще більш мінімальні різницеві прямокутники чи щось інше?

Тестовано в Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8.


3

Я шукав рішення Imagemagick, оскільки мені це знайоме, але врешті-решт я пішов із пропозицією @ Сема gifsicle. Це робилося просто те, що я хотів, ніяких клопотів.

Можна оптимізувати отриманий розмір файлу настільки багато способів, але я пішов із лише зменшенням розміру та зменшенням кількості кольорів. Працював як шарм:

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.