Pergunta

Eu não tenho o suficiente rep comentar sobre colaboradores do post, por isso vou perguntar aqui.Houve uma grande Q&A relação em massa de otimização de imagem aqui A granel, substituindo com as imagens compactadas?

Eu gostaria de configuração de um cron que é executado uma vez por mês, que executa imagem otimizações sugeridas no link acima.Dada a forma como o script iria funcionar, ele vai tentar re-otimização de imagens -, mas os recursos ser inteligente o suficiente para não degradar a qualidade?

Foi útil?

Solução

Há duas opções para a compressão de imagens,

  • Compressão sem perdas
  • A compressão com perdas

O primeiro pode ser executado várias vezes no mesmo arquivo, sem mais perda/degradação da qualidade (como o seu único realmente remoção de meta dados).Obviamente, após a primeira execução, não há nenhum benefício em execuções subseqüentes.

O último não deve ser repetidamente executa no mesmo arquivo, caso contrário, você irá degradar a qualidade de cada vez.A maneira mais simples para evitar que esta ocorrendo é simplesmente manter um log de atividade do que foi/não foi processada.

Nós escrevemos um par de scripts para MageStack fazer isso, como um lote/singular processo, o outro como um "ativo" do processo (que ativamente observa um directório para a mudança de processos e quaisquer arquivos alterados por si só).

Aqui está o script autônomo /microcloud/scripts/acc/image_optimise.sh,

#!/bin/bash

which sponge >/dev/null 2>&1 || ( echo "Error: moreutils must be installed" && exit 1 )
which advpng >/dev/null 2>&1 || ( echo "Error: advancecomp must be installed" && exit 1 )
which optipng >/dev/null 2>&1 || ( echo "Error: optipng must be installed" && exit 1 )
which jpegtran >/dev/null 2>&1 || ( echo "Error: libjpeg-progs must be installed" && exit 1 )
which jfifremove >/dev/null 2>&1 || ( echo "Error: jfifremove must be installed" && exit 1 )

function usage() {
  cat <<EOF
$(basename $0) Usage:

$(basename $0) [directory]

          directory      Directory containing images to optimise

EOF
  exit 0
}

function cleanup() {
  wait
  end_size=$(du -s . | awk '{print $1}')
  savings=$(( $start_size - $end_size ))
  megabytes=$(( $savings / 10**3 ))
  echo -e "\nSaved ${megabytes} MB"
  echo "Removing part files"
  find -path '*.optipart' -exec rm "{}" \; 2>/dev/null
  exit 1
}

function do_png () {
  advpng -z -q "$1"
  optipng -q "$1"
  return 0
}

function do_jpeg () {
  jpegtran -copy none -optimize -outfile "$1" "$1"
  jfifremove < "$1" | sponge "$1"
  return 0
}

function imgopt()
{
  ext=$(echo $1 | sed -E 's#.optipart$##g')
  case "$ext" in
    *.[Pp][Nn][Gg] )
      do_png "$1"
      ;;
    *.[Jj][Pp][Ee][Gg] )
      do_jpeg "$1"
      ;;
    *.[Jj][Pp][Gg] )
      do_jpeg "$1"
      ;;
    * )
    return 1
    ;;
  esac
}

trap cleanup 2 3

[ $# -lt 1 ] && usage
[ ! -d "$1" ] && echo "Error: Directory does not exist" && exit 1

dir=$1
cd $dir

touch .optimised.log
find . -regextype sed -regex '.*\.\(png\|jpe\?g\)$' | sed -E 's#\./##g' > .all.log
sort -u .all.log -o .all.log
sort -u .optimised.log -o .optimised.log
comm -23 .all.log .optimised.log > .process.log
rm .all.log

process_total=$(wc -l < .process.log)
total=0
count=0
files=()
start_time=$(date +%s)
threads=$(cat /proc/cpuinfo | grep -cE "^processor")
start_size=$(du -s . | awk '{print $1}')

echo "$process_total images to optimise"

while read i; do
  count=$(( count + 1 ))
  files+=( $i )
  if [ $count -eq $threads ] || [ $(( $process_total - $total )) -lt 1000 ]; then
    for f in ${files[@]}; do
      (
      cp -al $f{,.optipart}
      imgopt ${f}.optipart
      if [ $( stat -c %s ${f}.optipart ) -eq 0 ]; then
        rm ${f}.optipart
      else
        mv $f{.optipart,}
        echo $f >> .optimised.log
      fi
      ) &
    done
    wait
    total=$(( total + count ))
    count=0
    files=()
  else
    continue
  fi
  if [ $(( total % 1000 )) -eq 0 ]; then
    current_time=$(date +%s)
    elapsed=$(( $current_time - $start_time ))
    images_per_second=$(( $total / $elapsed ))
    remaining=$(( ( ( $process_total / $images_per_second ) - $elapsed ) / 60 ))
    percentage=$(( ( $total * 100 ) / $process_total ))
    completion_time=$( date +%r -d "$remaining minutes" )
    echo "$elapsed seconds elapsed. $total/$process_total images optimised (${percentage}%) at $images_per_second images/sec. Est. ~$remaining minutes remaining ($completion_time )"
  fi
done < .process.log

cleanup

Outro utilitário é mage-watch.sh (a fonte é muito demorado para postar aqui), mas você pode baixá-lo a partir de https://sys.sonassi.com/scripts/mage-watch.sh (há um

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top