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.