проверьте ширину изображения перед его конвертацией

проверьте ширину изображения перед его конвертацией

jpgДля конвертации всех изображений я использую следующий скрипт png:

# 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\> \{} \;

но сегодня я был в шоке, когда я побежал

ls -l 

и нашел все фотографии изменены, данные изменены, большие или нет

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

Поэтому я думаю об использовании ifусловия для проверки пути изображения в первую очередь, а затем, если WIDTH больше 1280px, запустить convert. В противном случае ничего не делать.


обновление 2

Я создал этот скрипт

#!/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

Так я findлучше вижу for.

forне выполнялся поиск во всех папках и подпапках.


обновление 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

это работает хорошо, но я получаю

jpegtopnm: WRITING PPM FILE

когда нет изображений> 1280

решение1

Основная проблема с вашей convertкомандой заключается в том, что аргумент $WIDTHx$HEIGHT\>пытается расширить переменную с именем $WIDTHx. Поскольку эта переменная не существует, аргумент, используемый с , -resizeбудет просто тем, что $HEIGHT\>есть (что то же самое, что и использование "${HEIGHT}x$HEIGHT>"). Вы исправляете это, используя -resize "${WIDTH}x$HEIGHT>". Это проблема в обеих ваших findкомандах.

Чтобы уменьшить слишком большие изображения, вы можете использовать что-то вроде

#!/bin/sh

w=1280
h=720

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

Лично я бы просто восстановил изображения из последней резервной копии, поскольку подобное масштабирование изображений неизбежно приведет к резкому снижению их качества.

При тестировании запускайте меньшие наборы копий изображений, прежде чем запускать скрипты на всю коллекцию изображений. Также убедитесь, что резервные копии работают как положено.

решение2

Мне очень жаль, что я выразился неясно, я нашел и создал свой окончательный сценарий и надеюсь исправить название Q на более умное

Скрипт ищет файлы jpgили pngи если находит, проверяет ширину, если находит больше 1280, преобразует

#!/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

Связанный контент