verifique el ancho de la imagen antes de convertirla

verifique el ancho de la imagen antes de convertirla

Utilizo el siguiente script para convertir todas jpglas pngimágenes:

# absolute path to image folder
FOLDER="/home/*/public_html/"

# max width
WIDTH=1280

# max height
HEIGHT=720

#resize png or jpg to either height or width, keeps proportions using imagemagick
find ${FOLDER}  -type f \( -iname \*.jpg -o -iname \*.png \)    -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;

pero hoy me sorprendí cuando corrí

ls -l 

y encontré todas las fotos modificadas, datos cambiados, grandes o no

 Oct 28 11:18 /home/photos/20210321/T161631305496ece25372fc18a9239da7911ac7c0dd056 (2).jpg

Así que estoy pensando en usar una ifcondición para verificar primero la ruta de la imagen y luego, si WIDTH es mayor que 1280 px, ejecutar convert. De lo contrario no hagas nada.


actualización 2

Construí este script

#!/bin/bash
for  i in /root/d/*.jpg; do
  read -r w h <<< $(identify -format "%w %h" "$i")
  if [ $w -gt  1280 ]; then
    FOLDER="$i"
    WIDTH=1280
    HEIGHT=720
    find ${FOLDER}  -type f \( -iname \*.jpg -o -iname \*.png \)    -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;
  fi
done

Así veo findmejor for.

forNo busqué en todas las carpetas y subcarpetas.


actualización 3

WIDTH=1280
HEIGHT=720
find /home/sen/tes/  -type f \( -iname \*.jpg -o -iname \*.png \)   | while read img; do \
  anytopnm "$img" | pamfile | \
   perl -ane 'exit 1 if $F[3]>1280' || convert  "$img"    -verbose -resize "${WIDTH}x${HEIGHT}>"   "$img"; \
done

está funcionando bien, pero lo entiendo

jpegtopnm: WRITING PPM FILE

cuando no hay imágenes> 1280

Respuesta1

El principal problema con su convertcomando es que el argumento $WIDTHx$HEIGHT\>intenta expandir una variable llamada $WIDTHx. Como esta variable no existe, el argumento usado con -resizeserá simplemente lo que $HEIGHT\>sea (que es lo mismo que usar "${HEIGHT}x$HEIGHT>"). Esto se soluciona usando -resize "${WIDTH}x$HEIGHT>". Este es un problema en ambos findcomandos.

Para reducir sus imágenes demasiado grandes, posiblemente podría usar algo como

#!/bin/sh

w=1280
h=720

find /home/*/public_html -type f \( -iname '*.jpg' -o -name '*.png' \) \
    -exec convert -resize "${w}x${h}>" {} \;

Personalmente, simplemente restauraría las imágenes desde la última copia de seguridad, ya que escalar las imágenes hacia arriba y hacia abajo de esta manera seguramente reducirá su calidad drásticamente.

Cuando pruebes las cosas, ejecuta conjuntos más pequeños de copias de tus imágenes antes de dejar que tus scripts se suelten en toda tu colección de imágenes. También asegúrese de que sus copias de seguridad se estén ejecutando como se esperaba.

Respuesta2

Lamento mucho no haber sido claro, encontré y construí mi script final y espero corregir el título de Q con uno inteligente.

script busca archivos jpgo pngy, si los encuentra, marque el ancho si se encuentra mayor que 1280, convertirá

#!/bin/bash
find /home/sen/tes/  -type f \( -iname \*.jpg -o -iname \*.png \)   | while read i; do \
read -r w h <<<$(identify -format "%w %h" "$i")
if [ $w  ]; then
if [ $w -gt  1280 ]; then
FOLDER="$i"
WIDTH=1280
HEIGHT=720
find ${FOLDER}  -type f \( -iname \*.jpg -o -iname \*.png \)    -exec convert \{} -verbose -resize ${WIDTH}x${HEIGHT}\> \{} \;
fi
fi
done

información relacionada