Girar imágenes desde la terminal

34

Tengo un directorio con mucha imagen pero están en una orientación incorrecta. Quiero rotar las imágenes para corregir la orientación (principalmente ± 90 o ). Usando el visor de imágenes (foto de shotwell) puedo rotarlos individualmente haciendo clic en el botón rotar, pero eso es demasiado tedioso.

Miré man shotwelly shotwell --help-allno hay nada que explique cómo invocar el comando rotar desde la línea de comandos.

¿Hay alguna forma de invocar el comando rotar de shotwell (o cualquier otro visor) desde la terminal? O cualquier otro método para rotar imágenes también es bienvenido.

pranphy
fuente
1
askubuntu.com/a/432662/15811 si lo desea de nautilus. Pero el comando de terminal que desea es "convertir" de "imagemagick"
Rinzwind
1
Si desea una rotación sin pérdidas y los archivos son jpeg, eche un vistazo a jpegtran ; imagemagick hará una rotación con pérdidas (francamente pequeña) .
Rmano

Respuestas:

39

Si está buscando una implementación de bash puro, el convertcomando de ImageMagick es lo que está buscando:

for szFile in /path/*.png
do 
    convert "$szFile" -rotate 90 /tmp/"$(basename "$szFile")" ; 
done

Arriba dejará los archivos existentes intactos y copiará los recién rotados para /tmpque pueda moverlos o copiarlos en otro lugar o incluso reemplazar los existentes después de la conversión y después de la verificación .

(y funcionará en todas las versiones recientes de Ubuntu, ya que es un software estándar)

Fabby
fuente
28
for file in *.JPG; do convert $file -rotate 90 rotated-$file; done

Esto copiará, rotará y cambiará el nombre de sus archivos.

Si aún desea dejar intactos los archivos originales, este método puede funcionar bien para usted ...

Tenga en cuenta que esto distingue entre mayúsculas y minúsculas: si sus archivos se llaman * .jpg, reemplácelos con minúsculas (o * .png ...) en consecuencia.

loco por natty
fuente
4

Si desea sobrescribir en el lugar, mogrifydesde la suite ImageMagick parece ser la forma más fácil de lograr esto:

# counterclockwise:
mogrify -rotate -90 *.jpg

# clockwise:
mogrify -rotate 90 *.jpg

PRUEBA : Este no es un método de rotación sin pérdida para archivos JPEG, https://www.imagemagick.org/discourse-server/viewtopic.php?t=5899 . jpegtranlogra esto (no probado):

# counterclockwise
ls *.jpg | xargs -n 1 jpegtran -perfect -rotate 270

# clockwise
ls *.jpg | xargs -n 1 jpegtran -perfect -rotate 90
krlmlr
fuente
Funciona perfectamente
Paul Jones
Mogrify es un cuchillo suizo en lo que respecta a la edición de imágenes por lotes simple, rápida
EA304GT
mejor respuesta, ¿por qué no quieres hacer esto en el lugar?
mLstudent33
1
@ mLstudent33: Buena pregunta. Parece que mogrifyno es sin pérdida para archivos JPEG, pero lo jpegtranes.
krlmlr
3

Así es como lo hago:

  1. Instalar gThumb

    sudo apt-get install gthumb
  2. Abre nautilus y ve a tu directorio de imágenes. Haga clic derecho sobre uno y elija Open with -> gthumb.

  3. Debajo del viewmenú, elija Browsero presione la Esctecla. Esto abrirá el navegador del directorio que muestra todas sus imágenes.

    ingrese la descripción de la imagen aquí

  4. Presione Ctrly seleccione las imágenes que desea rotar o selecciónelas todas mediante Ctrl+ A.

  5. En la barra de herramientas, seleccione Toolsy luego Rotate Righto Rotate Leftsegún su preferencia.

    ingrese la descripción de la imagen aquí

Parto
fuente
0

Una buena solución es hacer un conjunto de copias de seguridad (por ejemplo, con prefijo backup-), rotar los archivos originales produciendo un conjunto de archivos nuevos (con prefijo, por ejemplo rotated-), dándole un conjunto de

  • img-1.png
  • backup-img-1.png
  • rotated-img-1.png
  • img-2.png
  • ...y así

El mv/ cptools [bash globbing] solo puede agregar prefijos, es complicado quitarlos (usaría la expansión de parámetros, ewww ...)

La renameherramienta le permite usar la s/before/after/sintaxis de sustitución (de la sedherramienta) para intercambiar ese prefijo de salvaguarda y sobrescribir los archivos originales, por lo que su proceso general para un conjunto determinado de imágenes img-{1..n}.png sería:

for imgf in img-*.png; do mv "$imgf" "backup-$imgf"; done
for imgf in backup-img-*.png; do convert "$imgf" -rotate 90 "rotated-$imgf"; done

Nota:

  • podría usar en cplugar de mv, pero luego hay 2 copias del original por ahí (lo malo es que obtiene la concatenación de prefijos, " rotated-backup-...")
  • la rotación es en el sentido de las agujas del reloj ( -rotate 270te da 90 ° en sentido antihorario)
  • para seguir el progreso, agregue echo "Rotating ${imgf#backup-} ... ";después de las convertllamadas (antes done)
  • para una forma más compacta (por ejemplo un conjunto de archivos numerados), utilizar un poco de expansión de parámetros como echo "$(echo ${imgf#backup-img-} | cut -d\. -f 1)...";en vez

    (No puede eliminar el prefijo y el sufijo en la misma expansión de bash param, por lo tanto, use cut)

Luego, después de la verificación, no ha estropeado, elimine las imágenes volviéndolas al original

rename 's/^rotated-//;' rotated-*
rm backup-img-*
Louis Maddox
fuente
0

Puede copiar / pegar este código y guardarlo 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

Después de guardar este archivo, ejecútelo desde la terminal usando ./rotate.sh folder_containing_images.

vin
fuente
Por favor revise su código y el enlace dado!
George Udosen