Como girar todas as imagens em um diretório com o imagemagick?


Respostas:


20

Existem alguns problemas com seu código. Primeiro de tudo, você está analisando ls, o que é uma Má Idéia . Você também precisa se referir à variável conforme $fileindicado e também deve citá-la para que não se quebre em espaços. Você está declarando, nummas nunca é usado. Uma maneira mais segura seria:

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

Isso ainda terá problemas se seus arquivos contiverem novas linhas, mas pelo menos não serão interrompidos se o seu caminho contiver espaços.

Se os arquivos estiverem todos no mesmo diretório, poderá ser ainda mais simplificado usando o globbing. Você também pode usar a expansão de parâmetros para criar, em foo_rotated.JPG1vez de foo.JPG_rotated.JPG:

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

2
Seu método irá criar original_filename.JPG_rotated.JPG". adicionar "${file%.JPG}"_rotated.JPG será imho mais apropriado. Felicidades!
Valentin Bajrami

11
@ val0x00ff absolutamente (e eu votei na sua resposta, o que sugere isso). Acabei de repetir exatamente o que o OP estava fazendo corrigindo os erros mais evidentes.
terdon

legal! Acabei de modificar um pouco o seu comando.
Valentin Bajrami

11

mogrify -rotate 90 *.jpg O One-Liner melhor para girar todas as imagens com o imagemagick

mogrify -rotate 90 /tmp/p/DSC*.JPG irá infactar girar tudo .JPGcomeçando com DSCnop diretório

Mogrify (parte do imagemagick) difere de Convertque modifica o arquivo original http://www.imagemagick.org/script/mogrify.php


11

Um método simples usando PE (expansão de parâmetros) é

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

11
Deve-se notar que não há nada bashespecífico, é a sintaxe POSIX sh perfeitamente padrão.
Stéphane Chazelas

6

Não analisels e o lsnão é necessário aqui. Além disso, você deve citar suas variáveis ​​caso elas contenham espaços.

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

espaço ... ou abas, ou nova linha ou asterisco ou de interrogação ou colchete ...
Stéphane Chazelas

6

Não é uma solução imagemagic, mas

sips -r 90 *.JPG

girará todas as imagens que terminem em .JPG 90 graus. É um bom forro.


11
fwiw, isso substitui as imagens originais.
don_crissti

0

Eu precisava me referir ao arquivo como $file, ie

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

0

Você pode copiar / colar esse código no ubuntu e salvá-lo como "rotate.sh"

#!/bin/bash -e

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

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

cd CUR_DIR

Depois de salvar este arquivo, execute-o no terminal usando ./rotate.sh folder_containing_images

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.