Відповіді:
ImageOptim використовує Gifsicle для стиснення Gif. Наскільки я знаю, вона працює досить добре (я зазвичай не використовую Gif). З їх сайту:
Оптимізуйте свої анімації! Це зберігає лише змінену частину кожного кадру і може радикально зменшити ваші GIF. Ви також можете використовувати прозорість, щоб зробити їх ще меншими. Оптимізатор Gifsicle досить потужний і, як правило, зводить анімацію до декількох байтів найкращих комерційних оптимізаторів.
Я використовую ezgif.com/optimize , оскільки GIMP та інші інструменти не дуже добре справляються з цим завданням. Різниця полягає в тому, що ezgif використовує gifsicle
модифікацію (з lossy
прапором), недоступну у apt
версії. Дивіться випуск 1.82.1 тут (замініть /usr/bin/gifsicle
відповідним для вашої системи (двійкове закінчення -static
).
Мої замітки про повний робочий процес з оптимізації gif є тут .
Редагувати : поточний сценарій, як він використовується, буде оновлений на GitHub тут
Я не опишу, як я все це роблю тут, загальна ідея - це декілька баш-функцій / псевдонімів:
function gifopt() {
# args: $input_file ($loss_level)
if [ -z "$2" ]
then
# use default of 30
local loss_level=30
elif [[ "$2" =~ ^[0-9]+$ ]] && [ "$2" -ge 30 -a "$2" -le 200 ]
then
local loss_level=$2
else
echo "${2:-"Loss level parameter must be an integer from 30-200"}" 1>&2
exit 1
fi
local inputgif="${1?'Missing input file parameter'}"
local gifname="$(basename $inputgif .gif)"
local basegifname=$(echo "$gifname" | sed 's/_reduced_x[0-9]//g')
local outputgif="$basegifname-opt.gif"
gifsicle -O3 --lossy="$loss_level" -o "$outputgif" "$inputgif";
local oldfilesize=$(du -h $inputgif | cut -f1)
local newfilesize=$(du -h $outputgif | cut -f1)
echo "File reduced from $oldfilesize to $newfilesize as $outputgif"
}
function gifopt() {
# args: $input_file ($loss_level)
if [ -z "$2" ]
then
# use default of 30
loss_level=30
elif [[ "$2" =~ ^[0-9]+$ ]] && [ "$2" -ge 30 -a "$2" -le 200 ]
then
loss_level=$2
else
echo "${2:-"Loss level parameter must be an integer from 30-200"}" 1>&2
exit 1
fi
local inputgif="${1?'Missing input file parameter'}"
local gifname="$(basename $inputgif .gif)"
local basegifname=$(echo "$gifname" | sed 's/_reduced_x[0-9]//g')
local outputgif="$basegifname-opt.gif"
gifsicle -O3 --lossy="$loss_level" -o "$outputgif" "$inputgif";
local oldfilesize=$(du -h $inputgif | cut -f1)
local newfilesize=$(du -h $outputgif | cut -f1)
echo "File reduced from $oldfilesize to $newfilesize as $outputgif"
}
function gifspeedchange() {
# args: $gif_path $frame_delay (1 = 0.1s)
local orig_gif="${1?'Missing GIF filename parameter'}"
local frame_delay=${2?'Missing frame delay parameter'}
gifsicle --batch --delay $frame_delay $orig_gif
local newframerate=$(echo "$frame_delay*10" | bc)
echo "new GIF frame rate: $newframerate ms"
}
--lossy
Прапор приймає ціле число від 30 до 200, тому для кращої якості:
gifsicle -O3 --lossy=30 -o output.gif input.gif
За допомогою наведеної вище функції gifopt
ви можете спростити питання, оскільки вона за замовчуванням до 30
gifopt input.gif
... вихід буде автоматично названий input-opt.gif
. Ви можете змінити функцію, щоб використовувати --batch
прапор для редагування на місці, але я б не рекомендував перезаписувати початковий матеріал.
Ця функція також працює для видалення будь-якого _reduced_x
суфікса, доданого функцією зменшення кількості кадрів, тобто у вас може бути проміжний файл input_reduced_x2.gif
(крок, який би ~ вдвічі зменшив розмір файлу, скинувши кожен інший кадр).
Якщо ви зробили це, швидкість може змінитися, фіксуючи, gifspeedchange input-opt.gif 5
наприклад, використовувати затримку кадру 50мс.
Ви можете легко оптимізувати .gif файл на Gimp.
Просто збережіть як .gif, а потім стисніть, або ви можете зберегти в іншому розширенні як .jpeg чи інше.