web-dev-qa-db-fra.com

Comment redimensionner des images par lots dans Ubuntu de manière récursive dans le terminal?

J'ai plusieurs images stockées dans un ensemble de dossiers organisés. J'ai besoin de redimensionner ces images à un pourcentage spécifique récursivement à partir de leur répertoire parent. J'utilise Ubuntu 11.10 et je préfère apprendre à le faire directement depuis le terminal.

32
CompilingCyborg

Vous pouvez utiliser imagemagick . Par exemple, pour redimensionner toutes les images JPG sous le répertoire actuel à 50% de leur taille d'origine, vous pouvez faire:

for f in `find . -name "*.jpg"`
do
    convert $f -resize 50% $f.resized.jpg
done

Les fichiers résultants auront ".jpg" deux fois dans leurs noms. Si c'est un problème, vous pouvez vérifier les alternatives suivantes.

Pour parcourir/trouver les fichiers à redimensionner, vous pouvez également utiliser xargs . Exemple:

find . -name "*.jpg" | xargs convert -resize 50%

Cela créera des copies des images. Si vous souhaitez simplement les convertir en place , vous pouvez utiliser:

find . -name "*.jpg" | xargs mogrify -resize 50%
71
betabandido

Étendre la réponse de @betabandido

Dans le cas où il y a des espaces dans les noms de fichiers ou les noms de dossiers dans lesquels se trouvent les images, alors il faut utiliser -print0 avec find et -0 avec xargs pour éviter toute erreur d'analyse.

find . -name "*.jpg" -print0 | xargs -0 convert -resize 50%
find . -name "*.jpg" -print0 | xargs -0 mogrify -resize 50%
4
Gaurav Goyal

Cela fonctionne également si vous donnez la nouvelle résolution de redimensionnement:

convert $f.jpg -size 1024x768 $f.resized.png
1
Ritter

Vous pouvez aussi utiliser

Sudo apt-get install nautilus-image-converter

Mais cela ne fonctionne que pour l'image dans le dossier actuel. Il vous suffit d'installer puis de cliquer avec le bouton droit sur une image ou plusieurs et de choisir la taille que vous voulez et c'est tout.

Je crois que cela utilise également imagemagick.

0
stefanbc

il y a quelques réponses comme:

find . -name "*.jpg" | xargs convert -resize 50%

cela ne fonctionnera pas car cela étendra la liste comme ceci: convert -resize 50% a.jpg b.jpg c.jpg qui redimensionnera a.jpg dans c-0.jpg, b.jpg dans c-1.jpg et laissez c.jpg intact.

Vous devez donc exécuter la commande resize pour chaque correspondance et donner à la fois le nom du fichier d'entrée et le nom du fichier de sortie, avec quelque chose comme:

find . -name "*.jpg" | xargs -n 1 sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')'

chaque correspondance de find est transmise individuellement par xargs -n 1 au script de redimensionnement: sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')'. Ce script reçoit le nom de fichier dans l'argument $0, Utilise sed pour créer un nom de fichier de sortie en remplaçant le suffixe .jpg D'origine par un -th.jpg. Et il exécute la commande convert avec ces deux noms de fichiers.

Voici la version sans xargs mais find -exec:

find -name '*.jpg' -exec sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')' {} \;
0
loic.jaouen

Vous pouvez utiliser l'outil imagemagick pour le redimensionnement par lots.

Il maintiendra le rapport d'aspect

$ convert dragon.gif    -resize 64x64  resize_dragon.gif

Il ne conservera pas le rapport hauteur/largeur

$ convert dragon.gif    -resize 64x64\!  exact_dragon.gif

$ cat resize.sh 
#!/bin/bash
for f in `find . -name "*.jpg"`
do
    convert $f -resize 45x60\!  $f.resize.jpg
done

Il redimensionnera l'image à 45x60 sans maintenir le rapport hauteur/largeur dans le répertoire actuel.

0
Sarvsav Sharma