Überprüfen Sie die Breite des Bildes, bevor Sie es konvertieren

Überprüfen Sie die Breite des Bildes, bevor Sie es konvertieren

Ich verwende das folgende Skript, um alle jpgBilder zu konvertieren 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\> \{} \;

aber ich war heute schockiert, als ich lief

ls -l 

und fand alle Fotos modifiziert, Daten geändert, groß oder nicht

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

Ich denke also darüber nach, eine ifBedingung zu verwenden, um zuerst den Pfad des Bildes zu prüfen und dann, wenn WIDTH größer als 1280px ist, „auszuführen“ convert. Sonst nichts tun.


Aktualisierung 2

Ich habe dieses Skript erstellt

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

So kann ich findbesser sehen for.

forEs wurden nicht alle Ordner und Unterordner durchsucht.


Aktualisierung 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

es funktioniert gut, aber ich bekomme

jpegtopnm: WRITING PPM FILE

wenn keine Bilder> 1280

Antwort1

Das Hauptproblem mit Ihrem convertBefehl besteht darin, dass das Argument $WIDTHx$HEIGHT\>versucht, eine Variable namens zu erweitern $WIDTHx. Da diese Variable nicht existiert, -resizewird als Argument einfach das verwendet, was $HEIGHT\>ist (was dasselbe ist wie die Verwendung von "${HEIGHT}x$HEIGHT>"). Sie beheben dies, indem Sie verwenden -resize "${WIDTH}x$HEIGHT>". Dies ist ein Problem in beiden Ihrer findBefehle.

Um Ihre zu großen Bilder zu verkleinern, könnten Sie möglicherweise etwas wie verwenden

#!/bin/sh

w=1280
h=720

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

Persönlich würde ich einfach die Bilder aus der letzten Sicherung wiederherstellen, da ein derartiges Hoch- und Herunterskalieren der Bilder zwangsläufig zu einer drastischen Reduzierung ihrer Qualität führt.

Führen Sie beim Ausprobieren zunächst kleinere Kopien Ihrer Bilder aus, bevor Sie Ihre Skripte auf Ihre gesamte Bildersammlung loslassen. Stellen Sie außerdem sicher, dass Ihre Backups wie erwartet ausgeführt werden.

Antwort2

Es tut mir so leid, dass ich mich nicht klar ausgedrückt habe. Ich habe mein endgültiges Skript gefunden und erstellt und hoffe, den Titel von Q durch einen cleveren zu korrigieren.

Skriptsuche nach Dateien jpgoder pngund wenn gefunden überprüfen Breite wenn gefunden größer als 1280 wird konvertieren

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

verwandte Informationen