Adakah cara untuk secara otomatis mengkompres file .gif?

11

Saya memiliki 2.0 mb gif yang ingin saya buat lebih kecil, lebih disukai dengan menjatuhkan beberapa frame.

Apakah ada utilitas baris perintah atau program yang akan melakukannya untuk saya secara otomatis?

Terima kasih.

chiba
sumber
Anda mungkin ingin melihat ke dalam format webm: itu seperti gif yang lebih optimal!

Jawaban:

8

ImageOptim menggunakan Gifsicle untuk kompresi Gif-nya. Sejauh yang saya tahu, ini berfungsi dengan baik (saya biasanya tidak menggunakan Gif hari ini). Dari situs mereka:

Optimalkan animasi Anda! Ini hanya menyimpan bagian yang diubah dari setiap frame, dan secara radikal dapat menyusutkan GIF Anda. Anda juga dapat menggunakan transparansi untuk membuatnya lebih kecil. Pengoptimal Gifsicle cukup kuat, dan biasanya mengurangi animasi hingga beberapa byte dari pengoptimal komersial terbaik.

Shauna
sumber
6

Anda dapat menggunakan GimpInstal gimp untuk menghapus beberapa frame dari GIF serta mengoptimalkan kembali file dengan menyimpannya kembali ke GIF lagi.

MrMassiveManMeat
sumber
Bagaimana Anda mengoptimalkan kembali file pada penyimpanan di Gimp?
orschiro
2

Saya menggunakan ezgif.com/optimize , karena GIMP dan alat lain tidak bagus dalam pekerjaan ini. Perbedaannya adalah bahwa ezgif menggunakan gifsiclemodifikasi (dengan lossybendera), tidak tersedia pada aptversi. Lihat rilis 1.82.1 di sini (ganti /usr/bin/gifsicledengan yang sesuai untuk sistem Anda (biner diakhiri dengan -static).

Catatan saya tentang alur kerja optimasi gif lengkap ada di sini .

Sunting : skrip saat ini yang sedang digunakan akan diperbarui di GitHub di sini

Saya tidak akan menjelaskan bagaimana saya melakukan semuanya di sini, ide umumnya adalah beberapa fungsi bash / alias:

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"
}

The --lossybendera mengambil integer dari 30 sampai 200, jadi untuk kualitas terbaik:

gifsicle -O3 --lossy=30 -o output.gif input.gif

Dengan fungsi di atas, gifoptAnda dapat menyederhanakan masalah, karena defaultnya adalah 30

gifopt input.gif

... output akan dinamai secara otomatis input-opt.gif. Anda dapat mengubah fungsi untuk menggunakan --batchbendera untuk pengeditan di tempat tetapi saya tidak akan merekomendasikan untuk menimpa materi awal Anda.

Fungsi itu juga berfungsi untuk menghapus _reduced_xakhiran apa pun yang ditambahkan oleh fungsi pengurangan jumlah frame, yaitu Anda bisa memiliki file perantara input_reduced_x2.gif(langkah yang akan ~ membagi dua ukuran file dengan menjatuhkan setiap frame lainnya).

Jika Anda melakukannya, kecepatan mungkin berubah, diperbaiki dengan gifspeedchange input-opt.gif 5misalnya, untuk menggunakan penundaan bingkai 50 ms.

Louis Maddox
sumber
1

Anda dapat mengoptimalkan file .gif Anda di Gimp dengan mudah.

Cukup Simpan sebagai .gif lalu kompres atau Anda dapat menyimpan di ekstensi lain sebagai .jpeg atau lainnya.

Jorge Pinho
sumber
1
Bagaimana Anda mengompres di Gimp?
orschiro