Відповіді:
перший запуск:
convert do.gif -coalesce temporary.gif
тоді
convert -size <original size> temporary.gif -resize 24x24 smaller.gif
gifsicle --resize 24x24 > do-24.gif
може і до цього
-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.
Я шукав рішення Imagemagick, оскільки мені це знайоме, але врешті-решт я пішов із пропозицією @ Сема gifsicle
. Це робилося просто те, що я хотів, ніяких клопотів.
Можна оптимізувати отриманий розмір файлу настільки багато способів, але я пішов із лише зменшенням розміру та зменшенням кількості кольорів. Працював як шарм:
gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
-coalesce
"створює повний перегляд анімації в кожній точці, трохи схожа на справжню смужку фільму, а не анімаційну послідовність. Таку послідовність, відому як" Згуртована анімація " , набагато простіше вивчати, редагувати, змінювати та повторно оптимізувати."