Résolu Conversion d'images à la volée

Benoit P

Grand Maître
Hello les gens !

Dites, je suis à la recherche d'un soft qui me permettrait de convertir à la volée un dossier entier de plusieurs centaines de photos jpeg. Car j'ai un magnifique APN 10 Mpix mais les photos sont trop grandes pour pouvoir tout mettre sur un FTP et garder un temps de DL acceptable... Donc j'ai besoin d'un soft qui permet de passer des tofs à une résolution inférieure avec une qualité toujours acceptable. Et c'est un peu relou de faire ça a mano avec GIMP... Alors si vous connaissez un truc en ligne de commandes par exemple qui fait ça, ça m'intéresse.

Merci d'avance...
 

batchy

Grand Maître
Meilleure réponse
Code:
mkdir resized
for img in *.jpg; do convert $img -resize 320x240 resized/$img; done
comme ça à l'arrache. J'ai pas testé, mais ça devait ressembler à ça quand je l'avais fait.

oh et bien-sur il faut imagemagick (ou équivalent), sinon c'est pas drôle.
 

marsien

Grand Maître
Si la simplicité de la ligne de commande ne te tente pas, tu peux toujours passer par un gestionnaire de photo tel que Fspot ou Shotwell :)
 

zeb

Modérateur
pfff !
Pour éviter des commentaires comme ça, j'impose despotiquement la réponde de Batchy comme étant la meilleure :o
 

zeb

Modérateur
A première lecture, oui : la syntaxe est bonne.

Je ne spéculerai pas sur la commande convert puisque je ne l'ai pas sous la main pour vérifier.

Si tu veux vraiment du commentaire, en voilà. Un puriste te ferait remarquer que l'usage veut que les variables s'écrivent en majuscules, que tu n'as pas vérifié le retour de la création du répertoire et qu'en cas de d'absence de fichiers *.jpg, la commande for renvoie *.jpg, qui n'est pas un fichier.

Code:
mkdir resized &&
ls *.jpg >/dev/null 2>&1 &&
for IMG in *.jpg
do
    convert $IMG -resize 320x240 resized/$IMG
done

Et toujours pour ne rien dire, pourquoi ne pas renommer les fichiers avec leur nouvelle taille ?
Code:
convert $IMG -resize 320x240 resized/$( basename $IMG .jpg )-320x240.jpg

:D
 

batchy

Grand Maître
Et que se passe t'il si jamais il y a un fichier qui s'appelle '-write tamere.jpg tasoeur.jpg' ?

Et tu ne vérifie pas non plus que la commande convert à fonctionné. Ça se trouve il n'y a plus de place, t'a pas le droit de lire le fichier et de toute façon ça n'est pas un jpg valide ;)
 

zeb

Modérateur
Si la dernière commande d'une cascade de commandes ne fonctionne pas, ce n'est pas un problème, on lit le message d'erreur et c'est tout.

Ceci englobe les problèmes de droits et de validité des fichiers. S'il y a trois cents fichiers à traiter et qu'on obtient trois cents fois le message no space left ou cannot create, c'est con, mais les commandes dans la boucle sont indépendantes entre-elles. S'il y a trois cents fichiers à traiter et que la moitié est interdit de lecture, on aura quand même traité l'autre moitié.

En revanche, qu'un fichier puisse avoir un nom à la con, c'est bien plus problématique. :/

C'est pourquoi on place en général les noms de fichier à la fin des commandes, et pour être sûr, après le signe -- (double-tiret) qui signifie la fin des options.
En passant, la page du manuel indique que la syntaxe de la commande convert de ImageMagick suit cet usage :
[citation][nom]manpages[/nom]convert (1)
SYNOPSIS
convert [ options ... ] file [ file... ] file[/citation]

Je réécris donc la commande à passer :
Code:
convert -resize 320x240 -- "$IMG" "resized/$( basename $IMG .jpg )-320x240.jpg"

L'utilisation des doubles-quotes garantit le bon fonctionnement de la commande avec des noms contenant des espaces ou autres caractères particuliers.

:o ;)
 

batchy

Grand Maître

Même pas vrai. C'est la commande convert de GraphicsMagick. Celle de la dernière version d'ImageMagick est :
Code:
convert [input-options] input-file [output-options] output-file
GraphicsMagick étant un fork, c'est normal qu'il utilise les mêmes noms :o ;)

Et puis, si un des fichiers échoue, peut être faudrai t'il positionner la valeur de retour de l'ensemble à quelque chose de différent de 0 ;)
 

zeb

Modérateur
Beurk, c'est pas UNIX compliant, comme ligne de commande, ça !

0 signifie, tout c'est bien passé. Si 299 fichiers sur 300 ont correctement été converti, il faut quand même rendre compte que quelque chose s'est mal déroulé.
Effectivement, notre commande, dans une boucle, renverra le code de la dernière action.

T'es sûr qu'il faut gérer ça ?
Bon [:spamafote]
Code:
{
typeset OK=0
typeset RC=0
mkdir resized &&
ls *.jpg >/dev/null 2>&1 &&
for IMG in *.jpg
do
    convert "$IMG" -resize 320x240 "resized/$IMG" && 
    OK=1 || 
    RC=1
done
[ $RC -eq 1 -a $OK -eq 0 ] && RC=2
( exit $RC )
}

:D
 

marsien

Grand Maître
Ouais, ben c'est plus simple avec Shotwell, et plus rapide finalement :D

Plus sérieusement, ma réponse sur des interfaces graphiques avait pour but de casser le mythe persistent que pour un usage bureautique, Linux impose (toujours) la ligne de commande, pas facile d'accès à un néophyte...

Après je suis tout à fait d'accord, la ligne de commande est souvent le moyen le plus simple et efficace de réaliser une action ;)
 

zeb

Modérateur
Nan. C'est plus simple avec une ligne de commande.

Les vérifications et les retours d'erreur sont à ajouter si l'on souhaite faire un script de la meilleure solution proposée par Batchy !

[:dictateur]
 

marsien

Grand Maître



:merci:
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 131
Messages
6 717 940
Membres
1 586 382
Dernier membre
alejandrooo
Partager cette page
Haut