Comment faire pivoter toutes les images d'un répertoire avec imagemagick?


18

Je veux faire pivoter toutes les images d'un répertoire qui correspondent à un motif.

Jusqu'à présent, j'ai:

for file in `ls /tmp/p/DSC*.JPG`; do
  convert $file -rotate 90 file+'_rotated'.JPG
done

mais cela ne donne aucune sortie?

Réponses:


20

Il y a pas mal de problèmes avec votre code. Tout d'abord, vous analysez ls qui est une mauvaise idée . Vous devez également faire référence à la variable comme $filevous le faites remarquer et vous devez également la citer pour qu'elle ne se casse pas sur les espaces. Vous déclarez nummais il n'est jamais utilisé. Un moyen plus sûr serait:

find /tmp/p/ -name "DSC*.JPG" | while IFS= read -r file; do
  convert "$file" -rotate 90 "$file"_rotated.JPG
done

Cela aura toujours des problèmes si vos fichiers contiennent des sauts de ligne mais au moins ne se cassera pas si votre chemin contient des espaces.

Si les fichiers sont tous dans le même répertoire, il peut être encore simplifié en utilisant la globalisation. Vous pouvez également utiliser l'expansion des paramètres pour créer foo_rotated.JPG1au lieu de foo.JPG_rotated.JPG:

for file in /tmp/p/DSC*.JPG; do
  convert "$file" -rotate 90 "${file%.JPG}"_rotated.JPG
done

2
Votre méthode va créer original_filename.JPG_rotated.JPG". l'ajout "${file%.JPG}"_rotated.JPG sera à mon humble avis plus approprié. À votre santé!
Valentin Bajrami

1
@ val0x00ff absolument (et j'ai surévalué votre réponse qui le suggère). Je viens de répéter exactement ce que le PO faisait en corrigeant les erreurs les plus flagrantes.
terdon

cool! Je viens de modifier un peu ta commande.
Valentin Bajrami

11

mogrify -rotate 90 *.jpg Le meilleur One-Liner pour faire pivoter toutes les images avec imagemagick

mogrify -rotate 90 /tmp/p/DSC*.JPG va en fait tourner tout en .JPGcommençant par DSCdans le prépertoire

Mogrify (qui fait partie d'imagemagick) diffère du Convertfait qu'il modifie le fichier d'origine http://www.imagemagick.org/script/mogrify.php


11

Une méthode simple utilisant PE (Parameter Expansion) est

for f in /tmp/p/DSC*.JPG
do
  convert -rotate 90 "$f" "${f%.JPG}"_converted.JPG
done

1
Il convient de noter qu'il n'y a rien de bashspécifique là-dedans, c'est une syntaxe POSIX sh parfaitement standard.
Stéphane Chazelas

6

Ne pas analyserls et le lsn'est pas requis ici. De plus, vous devez citer vos variables au cas où elles contiennent des espaces.

for file in *.JPG; do
  convert -rotate 90 "$file" rotated_"$file"
done

espace ... ou tabulations, ou nouvelle ligne ou astérisque ou point d'interrogation ou crochet ...
Stéphane Chazelas

6

Pas une solution imaginaire, mais

sips -r 90 *.JPG

fera pivoter toutes les images se terminant par .JPG à 90 degrés. C'est une bonne doublure.


1
fwiw, cela écrase les images originales.
don_crissti

0

Je devais me référer au fichier comme $file, c.-à-d.

for file in `ls /tmp/p/DSC*.JPG`; do
  convert $file -rotate 90 $file+'_rotated'.JPG
done

0

Vous pouvez copier / coller ce code dans ubuntu, et l'enregistrer sous "rotation.sh"

#!/bin/bash -e

CUR_DIR=`pwd`
cd "${1}"

for file in *.jpg; do
    convert "${file}" -rotate 90 "${file}";
done

cd CUR_DIR

Après avoir enregistré ce fichier, exécutez-le à partir du terminal en utilisant ./rotate.sh folder_containing_images

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.