¿Alguna forma de comprimir automáticamente un archivo .gif?

11

Tengo un gif de 2.0 mb que quiero hacer más pequeño, preferiblemente soltando algunos cuadros.

¿Existe una utilidad de línea de comandos o un programa que lo haga por mí automáticamente?

Gracias.

chiba
fuente
Es posible que desee ver el formato webm: ¡es como un gif más optimizado!

Respuestas:

8

ImageOptim usa Gifsicle para su compresión Gif. Hasta donde sé, funciona bastante bien (generalmente no uso Gif en estos días). Desde su sitio:

¡Optimiza tus animaciones! Esto almacena solo la parte modificada de cada cuadro y puede reducir radicalmente sus GIF. También puede usar la transparencia para hacerlos aún más pequeños. El optimizador de Gifsicle es bastante potente, y generalmente reduce las animaciones a un par de bytes de los mejores optimizadores comerciales.

Shauna
fuente
6

Puede usar GimpInstalar gimp para eliminar algunos fotogramas del GIF, así como volver a optimizar el archivo volviéndolo a guardar en un GIF.

MrMassiveManMeat
fuente
¿Cómo se vuelve a optimizar el archivo al guardar en Gimp?
orschiro
2

Uso ezgif.com/optimize , ya que GIMP y otras herramientas no son buenas en este trabajo. La diferencia es que ezgif usa una gifsiclemodificación (con una lossybandera), no disponible en la aptversión. Vea la versión 1.82.1 aquí (reemplace /usr/bin/gifsiclecon la apropiada para su sistema (el binario que termina con -static).

Mis notas sobre un flujo de trabajo de optimización de gif completo están aquí .

Editar : la secuencia de comandos actual que se mantiene en uso se actualizará en GitHub aquí

No describiré cómo lo hago todo aquí, la idea general es algunas funciones / alias bash:

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

La --lossybandera toma un número entero de 30 a 200, por lo que para obtener la mejor calidad:

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

Con la función anterior gifopt, puede simplificar las cosas, ya que el valor predeterminado es 30

gifopt input.gif

... la salida se nombrará automáticamente input-opt.gif. Puede cambiar la función para usar el --batchindicador para la edición in situ, pero no recomendaría sobrescribir su material de inicio.

Esa función también funciona para eliminar cualquier _reduced_xsufijo agregado por la función de reducción de conteo de cuadros, es decir, podría tener un archivo intermedio input_reduced_x2.gif(un paso que reduciría a la mitad el tamaño del archivo al dejar caer cualquier otro cuadro).

Si lo hizo, la velocidad puede cambiar, arreglado, gifspeedchange input-opt.gif 5por ejemplo, para usar un retraso de cuadro de 50 ms.

Louis Maddox
fuente
1

Puede optimizar su archivo .gif en Gimp fácilmente.

Simplemente guarde como .gif y luego comprima o puede guardar en otra extensión como .jpeg u otra.

Jorge Pinho
fuente
1
¿Cómo se comprime en Gimp?
orschiro