L'utilisation répétitive de OptiPNG / JPEGTran / GIFSicle
-
12-12-2019 - |
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é?
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