Question

Je n'ai pas assez de rep de commenter les contributeurs post, donc je vais poser la question ici.Il y avait un grand Q&A en ce qui concerne vrac optimisation de l'image ici En vrac en la remplaçant par des images compressées?

J'aimerais configurer un cron qui s'exécute une fois par mois, qui effectue des optimisations d'image proposé dans le lien ci-dessus.Étant donné la manière dont le script de travail, il va tenter de ré-optimiser les images - mais est-ce que ces ressources soient assez intelligents pour ne pas dégrader la qualité?

Était-ce utile?

La solution

Il y a deux options pour la compression d'image,

  • La compression sans perte
  • La compression avec perte

L'ancien peut être exécuté plusieurs fois sur le même fichier, sans perte/dégradation de la qualité (comme le son n'est vraiment suppression de méta-données).Évidemment, après la première manche, il n'y a aucun avantage sur les exécutions suivantes.

Cette dernière ne doit pas être exécuter plusieurs fois le même fichier, sinon, vous allez dégrader la qualité à chaque fois.La façon la plus simple pour éviter cette prédiction, est de simplement garder un journal d'activité de ce a/n'a pas été traitée.

Nous avons écrit quelques scripts pour MageStack pour ce faire, l'un comme un lot de/processus singulier, l'autre comme un "actif" (c'activement montres un répertoire pour les modifications et traite tous les fichiers modifiés par lui-même).

Voici le script autonome /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

L'autre utilitaire mage-watch.sh (la source est trop longue à poster ici), mais vous pouvez le télécharger à partir de https://sys.sonassi.com/scripts/mage-watch.sh (il y a un

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top