O uso repetitivo de OptiPNG / JPEGTran / GIFSicle
-
12-12-2019 - |
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?
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