Будь-який спосіб автоматичного стиснення .gif-файлу?


11

У мене є gif 2.0 mb, який я хочу зменшити, бажано, відкинувши кілька кадрів.

Чи є утиліта командного рядка або програма, яка зробить це для мене автоматично?

Спасибі.


Ви можете заглянути у формат webm: це як більш оптимізований gif!

Відповіді:


8

ImageOptim використовує Gifsicle для стиснення Gif. Наскільки я знаю, вона працює досить добре (я зазвичай не використовую Gif). З їх сайту:

Оптимізуйте свої анімації! Це зберігає лише змінену частину кожного кадру і може радикально зменшити ваші GIF. Ви також можете використовувати прозорість, щоб зробити їх ще меншими. Оптимізатор Gifsicle досить потужний і, як правило, зводить анімацію до декількох байтів найкращих комерційних оптимізаторів.


6

Ви можете використовувати GimpВстановити gimp для видалення деяких кадрів з GIF, а також повторну оптимізацію файлу, зберігаючи його знову в GIF.


Як повторно оптимізувати файл при збереженні в Gimp?
orschiro

2

Я використовую 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мс.


1

Ви можете легко оптимізувати .gif файл на Gimp.

Просто збережіть як .gif, а потім стисніть, або ви можете зберегти в іншому розширенні як .jpeg чи інше.


1
Як ви стискаєте в Gimp?
orschiro
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.