Come ruotare tutte le immagini in una directory con imagemagick?


Risposte:


20

Ci sono alcuni problemi con il tuo codice. Prima di tutto, stai analizzando ls che è una cattiva idea . Devi anche fare riferimento alla variabile come $filefai notare e dovresti anche citarla in modo che non si spezzi sugli spazi. Stai dichiarando numma non viene mai usato. Un modo più sicuro sarebbe:

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

Ciò avrà ancora problemi se i file contengono nuove righe, ma almeno non si interromperanno se il percorso contiene spazi.

Se i file si trovano tutti nella stessa directory, è possibile semplificarli ulteriormente utilizzando il globbing. È inoltre possibile utilizzare l'espansione dei parametri per creare foo_rotated.JPG1anziché foo.JPG_rotated.JPG:

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

2
Il tuo metodo creerà original_filename.JPG_rotated.JPG". l'aggiunta "${file%.JPG}"_rotated.JPG sarà un imho più appropriato. Saluti!
Valentin Bajrami,

1
@ val0x00ff assolutamente (e ho votato a favore della tua risposta che lo suggerisce). Ho appena ripetuto la cosa esatta che stava facendo l'OP correggendo gli errori più evidenti.
terdon

freddo! Ho appena modificato un po 'il tuo comando.
Valentin Bajrami,

11

mogrify -rotate 90 *.jpg Il miglior One-Liner per ruotare tutte le immagini con imagemagick

mogrify -rotate 90 /tmp/p/DSC*.JPG infatti ruoterà tutto a .JPGpartire da DSCnella pdirectory

Mogrify (parte di imagemagick) differisce dal fatto Convertche modifica il file originale http://www.imagemagick.org/script/mogrify.php


11

Un metodo semplice che utilizza PE (Parameter Expansion) è

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

1
Va notato che non c'è nulla di bashspecifico lì dentro, è la sintassi sh POSIX perfettamente standard.
Stéphane Chazelas,

6

Non analizzarels e lsqui non è richiesto. Inoltre, dovresti citare le tue variabili nel caso in cui contengano spazi.

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

spazio ... o tabulazioni, o newline o asterisco o punto interrogativo o parentesi quadra ...
Stéphane Chazelas,

6

Non una soluzione imagemagic, ma

sips -r 90 *.JPG

ruoterà tutte le immagini che terminano in .JPG di 90 gradi. È una buona fodera.


1
prima, questo sovrascrive le immagini originali.
don_crissti,

0

Avevo bisogno di fare riferimento al file come $file, ad es

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

0

Puoi copiare / incollare questo codice in Ubuntu e salvarlo come "rotate.sh"

#!/bin/bash -e

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

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

cd CUR_DIR

Dopo aver salvato questo file, eseguirlo dal terminale usando ./rotate.sh folder_containing_images

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.