123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #!/bin/bash
- # OptimizaPNG: Optimiza imágenes PNG y devuelve código para usar en Freak Spot
- # Copyright (C) 2017 Jorge Maldonado Ventura
- # This program is free software: you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation, either version 3 of the License, or
- # (at your option) any later version.
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- # You should have received a copy of the GNU General Public License
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
- # Optimiza imágenes para el uso en la web de Freak Spot y obtiene el código que
- # se debe introducir para que se vean las imágenes adecuadamente en multiples
- # resoluciones utilizando el atributo del elemento <img> srcset. Debe
- # ejecutarse en la carpeta donde se encuentra la imagen o no funcionará bien.
- usage(){
- cat << _EOF_
- Modo de empleo: optimage [OPCIÓN]... [IMAGEN]
- Este programa sirve para optimizar imagenes y generar código HTML para
- introducir en un sitio web. El código HTML se puede generar de manera que se
- incluya un enlace a la imagen en su máxima resolución. Es necesario ejecutar
- el programa en la misma carpeta donde se encuentra la imagen para que su URL
- se genere correctamente.
- Además de ofrecer la imagen en múltiples resoluciones, el programa realiza
- optimizaciones sin pérdida de calidad de imagenes PNG y JPEG. La optimización
- solo se realiza si se tiene el programa necesario para optimizar la imagen.
- optipng se requiere para optimizar imágenes PNG, y jpegoptim, para imagenes
- JPEG.
- OPCIONES
- -a Usa el texto alternativo indicado para la imagen
- -p Haz que el código HTML no se genere con un enlace
- -u Introduce la URL del sitio web sin barra al final (/)
- --version
- Muestra la información de la versión y sale del programa
- --help muestra esta ayuda y sale del programa
- _EOF_
- }
- print_err() {
- echo "$1" >&2
- }
- LINK_TO_FULL_RESOLUTION=1
- SITEURL=''
- ALT=''
- while getopts ":-:a:u:p" opt; do
- case $opt in
- -)
- if [ $OPTARG = "version" ]; then
- echo "OptimizaPNG 0.6"
- exit
- elif [ $OPTARG = "help" ]; then
- usage
- exit
- fi
- ;;
- p)
- echo "Procesando como imagen introductoria..."
- LINK_TO_FULL_RESOLUTION=0
- ;;
- a)
- ALT="$OPTARG"
- echo "Usando $ALT como texto alternativo para la imagen..."
- ;;
- u)
- SITEURL="$OPTARG"
- ;;
- :)
- echo "La opción -$OPTARG requiere un valor."
- exit 1
- ;;
- esac
- done
- FILE="${@: -1}"
- FILE_MIME_TYPE=`file -b --mime-type "$FILE"`
- if [[ $FILE_MIME_TYPE == 'image/png' ]]; then
- optipng $FILE || print_err 'No se ha optimizado la imagen. Asegúrate de tener optipng instalado'
- ext=png
- elif [[ $FILE_MIME_TYPE == 'image/jpeg' ]]; then
- jpegoptim $FILE || print_err 'No se ha optimizado la imagen. Asegúrate de tener jpegoptim instalado'
- ext=jpg
- else
- print_err 'Solo están soportadas las imagenes tipo JPEG y PNG'
- fi
- WIDTH=`identify -format %w $FILE`
- HEIGHT=`identify -format %h $FILE`
- BASE_FOLDER='content'
- FOLDER_URL=`pwd`
- FOLDER_OFFSET=`echo $FOLDER_URL | grep -bo $BASE_FOLDER | cut -d: -f1 | head --lines 1`
- FOLDER_URL=$SITEURL${FOLDER_URL: $FOLDER_OFFSET + ${#BASE_FOLDER}}'/'
- if (( $WIDTH >= 1500 )); then
- SMALL_WIDTH=$(($WIDTH/4))
- SMALL_HEIGHT=$(($HEIGHT/4))
- SMALL_FILENAME=${FILE::-4}-"$SMALL_WIDTH"x"$SMALL_HEIGHT".$ext
- MEDIUM_WIDTH=$(($WIDTH/2))
- MEDIUM_HEIGHT=$(($HEIGHT/2))
- MEDIUM_FILENAME=${FILE::-4}-"$MEDIUM_WIDTH"x"$MEDIUM_HEIGHT".$ext
- convert -resize "$SMALL_WIDTH"x"$SMALL_HEIGHT" $FILE $SMALL_FILENAME
- convert -resize "$MEDIUM_WIDTH"x"$MEDIUM_HEIGHT" $FILE $MEDIUM_FILENAME
- if [ $LINK_TO_FULL_RESOLUTION = 1 ]; then
- echo "<a href=\"$FOLDER_URL$FILE\">"
- fi
- echo "<img src=\"$FOLDER_URL$FILE\" alt=\"$ALT\" width=\"$WIDTH\" height=\"$HEIGHT\" srcset=\"$FOLDER_URL$FILE ${WIDTH}w, $FOLDER_URL$MEDIUM_FILENAME ${MEDIUM_WIDTH}w, $FOLDER_URL$SMALL_FILENAME ${SMALL_WIDTH}w\" sizes=\"(max-width: ${WIDTH}px) 100vw, ${WIDTH}px\">"
- if [ $LINK_TO_FULL_RESOLUTION = 1 ]; then
- echo '</a>'
- fi
- elif (( $WIDTH >= 730)); then
- SMALL_WIDTH=$(($WIDTH/2))
- SMALL_HEIGHT=$(($HEIGHT/2))
- SMALL_FILENAME=${FILE::-4}-"$SMALL_WIDTH"x"$SMALL_HEIGHT".$ext
- convert -resize "$SMALL_WIDTH"x"$SMALL_HEIGHT" $FILE $SMALL_FILENAME
- if [ $LINK_TO_FULL_RESOLUTION = 1 ]; then
- echo "<a href=\"$FOLDER_URL$FILE\">"
- fi
- echo "<img src=\"$FOLDER_URL$FILE\" alt=\"$ALT\" width=\"$WIDTH\" height=\"$HEIGHT\" srcset=\"$FOLDER_URL$FILE ${WIDTH}w, $FOLDER_URL$SMALL_FILENAME ${SMALL_WIDTH}w\" sizes=\"(max-width: ${WIDTH}px) 100vw, ${WIDTH}px\">"
- if [ $LINK_TO_FULL_RESOLUTION = 1 ]; then
- echo '</a>'
- fi
- else
- if [ $LINK_TO_FULL_RESOLUTION = 1 ]; then
- echo "<a href=\"$FOLDER_URL$FILE\">"
- fi
- echo "<img src=\"$FOLDER_URL$FILE\" alt=\"$ALT\">"
- if [ $LINK_TO_FULL_RESOLUTION = 1 ]; then
- echo '</a>'
- fi
- fi
|