optimage 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #!/bin/bash
  2. # OptimizaPNG: Optimiza imágenes PNG y devuelve código para usar en Freak Spot
  3. # Copyright (C) 2017 Jorge Maldonado Ventura
  4. # This program is free software: you can redistribute it and/or modify
  5. # it under the terms of the GNU General Public License as published by
  6. # the Free Software Foundation, either version 3 of the License, or
  7. # (at your option) any later version.
  8. # This program is distributed in the hope that it will be useful,
  9. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. # GNU General Public License for more details.
  12. # You should have received a copy of the GNU General Public License
  13. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  14. # Optimiza imágenes para el uso en la web de Freak Spot y obtiene el código que
  15. # se debe introducir para que se vean las imágenes adecuadamente en multiples
  16. # resoluciones utilizando el atributo del elemento <img> srcset. Debe
  17. # ejecutarse en la carpeta donde se encuentra la imagen o no funcionará bien.
  18. usage(){
  19. cat << _EOF_
  20. Modo de empleo: optimage [OPCIÓN]... [IMAGEN]
  21. Este programa sirve para optimizar imagenes y generar código HTML para
  22. introducir en un sitio web. El código HTML se puede generar de manera que se
  23. incluya un enlace a la imagen en su máxima resolución. Es necesario ejecutar
  24. el programa en la misma carpeta donde se encuentra la imagen para que su URL
  25. se genere correctamente.
  26. Además de ofrecer la imagen en múltiples resoluciones, el programa realiza
  27. optimizaciones sin pérdida de calidad de imagenes PNG y JPEG. La optimización
  28. solo se realiza si se tiene el programa necesario para optimizar la imagen.
  29. optipng se requiere para optimizar imágenes PNG, y jpegoptim, para imagenes
  30. JPEG.
  31. OPCIONES
  32. -a Usa el texto alternativo indicado para la imagen
  33. -p Haz que el código HTML no se genere con un enlace
  34. -u Introduce la URL del sitio web sin barra al final (/)
  35. --version
  36. Muestra la información de la versión y sale del programa
  37. --help muestra esta ayuda y sale del programa
  38. _EOF_
  39. }
  40. print_err() {
  41. echo "$1" >&2
  42. }
  43. LINK_TO_FULL_RESOLUTION=1
  44. SITEURL=''
  45. ALT=''
  46. while getopts ":-:a:u:p" opt; do
  47. case $opt in
  48. -)
  49. if [ $OPTARG = "version" ]; then
  50. echo "OptimizaPNG 0.6"
  51. exit
  52. elif [ $OPTARG = "help" ]; then
  53. usage
  54. exit
  55. fi
  56. ;;
  57. p)
  58. echo "Procesando como imagen introductoria..."
  59. LINK_TO_FULL_RESOLUTION=0
  60. ;;
  61. a)
  62. ALT="$OPTARG"
  63. echo "Usando $ALT como texto alternativo para la imagen..."
  64. ;;
  65. u)
  66. SITEURL="$OPTARG"
  67. ;;
  68. :)
  69. echo "La opción -$OPTARG requiere un valor."
  70. exit 1
  71. ;;
  72. esac
  73. done
  74. FILE="${@: -1}"
  75. FILE_MIME_TYPE=`file -b --mime-type "$FILE"`
  76. if [[ $FILE_MIME_TYPE == 'image/png' ]]; then
  77. optipng $FILE || print_err 'No se ha optimizado la imagen. Asegúrate de tener optipng instalado'
  78. ext=png
  79. elif [[ $FILE_MIME_TYPE == 'image/jpeg' ]]; then
  80. jpegoptim $FILE || print_err 'No se ha optimizado la imagen. Asegúrate de tener jpegoptim instalado'
  81. ext=jpg
  82. else
  83. print_err 'Solo están soportadas las imagenes tipo JPEG y PNG'
  84. fi
  85. WIDTH=`identify -format %w $FILE`
  86. HEIGHT=`identify -format %h $FILE`
  87. BASE_FOLDER='content'
  88. FOLDER_URL=`pwd`
  89. FOLDER_OFFSET=`echo $FOLDER_URL | grep -bo $BASE_FOLDER | cut -d: -f1 | head --lines 1`
  90. FOLDER_URL=$SITEURL${FOLDER_URL: $FOLDER_OFFSET + ${#BASE_FOLDER}}'/'
  91. if (( $WIDTH >= 1500 )); then
  92. SMALL_WIDTH=$(($WIDTH/4))
  93. SMALL_HEIGHT=$(($HEIGHT/4))
  94. SMALL_FILENAME=${FILE::-4}-"$SMALL_WIDTH"x"$SMALL_HEIGHT".$ext
  95. MEDIUM_WIDTH=$(($WIDTH/2))
  96. MEDIUM_HEIGHT=$(($HEIGHT/2))
  97. MEDIUM_FILENAME=${FILE::-4}-"$MEDIUM_WIDTH"x"$MEDIUM_HEIGHT".$ext
  98. convert -resize "$SMALL_WIDTH"x"$SMALL_HEIGHT" $FILE $SMALL_FILENAME
  99. convert -resize "$MEDIUM_WIDTH"x"$MEDIUM_HEIGHT" $FILE $MEDIUM_FILENAME
  100. if [ $LINK_TO_FULL_RESOLUTION = 1 ]; then
  101. echo "<a href=\"$FOLDER_URL$FILE\">"
  102. fi
  103. 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\">"
  104. if [ $LINK_TO_FULL_RESOLUTION = 1 ]; then
  105. echo '</a>'
  106. fi
  107. elif (( $WIDTH >= 730)); then
  108. SMALL_WIDTH=$(($WIDTH/2))
  109. SMALL_HEIGHT=$(($HEIGHT/2))
  110. SMALL_FILENAME=${FILE::-4}-"$SMALL_WIDTH"x"$SMALL_HEIGHT".$ext
  111. convert -resize "$SMALL_WIDTH"x"$SMALL_HEIGHT" $FILE $SMALL_FILENAME
  112. if [ $LINK_TO_FULL_RESOLUTION = 1 ]; then
  113. echo "<a href=\"$FOLDER_URL$FILE\">"
  114. fi
  115. 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\">"
  116. if [ $LINK_TO_FULL_RESOLUTION = 1 ]; then
  117. echo '</a>'
  118. fi
  119. else
  120. if [ $LINK_TO_FULL_RESOLUTION = 1 ]; then
  121. echo "<a href=\"$FOLDER_URL$FILE\">"
  122. fi
  123. echo "<img src=\"$FOLDER_URL$FILE\" alt=\"$ALT\">"
  124. if [ $LINK_TO_FULL_RESOLUTION = 1 ]; then
  125. echo '</a>'
  126. fi
  127. fi