web-dev-qa-db-fra.com

Comment traiter en lots des images JPG pour changer sa qualité avec Nautilus-Actions?

Tout d’abord: merci d’avoir pris le temps de lire ceci et de nous aider. Tous les conseils sont appréciés.

J'utilise Nautilus-Actions afin d'ajouter l'action d'un menu contextuel personnalisé afin de créer une copie d'une image JPG et de réduire sa qualité (et la taille du fichier) tout en préservant les dimensions de l'image.

Disons: j'ai cette image avec les propriétés de l'image comme pour une taille de fichier de 2,3 Mo (2 261 588 octets) et:

enter image description here

Et, après avoir ouvert le fichier dans GIMP 2.8, il vous suffit d’exporter une copie et d’utiliser la boîte de dialogue Exportation JPG pour réduire la qualité de l’image à 30%, comme indiqué dans la capture d’écran suivante:

enter image description here

Je récupère les propriétés de l'image suivante dans la copie de l'image (taille du fichier de 251,8 ko (251 797 octets)):

enter image description here

Maintenant.

J'utilise Nautilus Actions afin de traiter par lots un grand nombre d'images afin de reproduire le même comportement via le menu contextuel en sélectionnant un ensemble de fichiers dans Nautilus, en cliquant avec le bouton droit de la souris sur l'un de ces fichiers et en choisissant l'action appropriée de Nautilus Actions. Le résultat est un fichier contenant l'image dans les mêmes dimensions que l'original, avec une qualité moindre bien sûr et une taille de fichier légèrement supérieure (taille de fichier de 275,3 Ko (275 265 octets)), mais ce n'est pas un problème majeur pour moi.

Le problème

Se produit lorsque j'essaie de traiter par lots plusieurs fichiers image, ce qui entraîne le clonage du premier nom de fichier en plusieurs noms de fichiers contenant une image différente. Avec les propriétés que j'ai définies dans le prochain jeu de commandes:

enter image description here

En gros, chaque action Nautilus utilise les paramètres suivants:

Commande: convert

  • De (imagemagick)

Paramètres: %F.jpg -quality 80%% %F-80q.jpg

  • Ce qui est interprété comme: convert path/to/file1.mid.jpg -quality=80% path/to/file1.mid-80q.jpg

Répertoire de travail: %d

  • S'est expliqué.

Donc, les résultats peuvent être vus dans cette capture d'écran:

enter image description here

Ici, nous pouvons voir chaque image traitée dans un fichier différent, mais seul le premier nom de fichier est utilisé pour attribuer les nouveaux noms aux fichiers copiés. Je souhaite un résultat comme:

File1.jpg === File1-80q.jpg
File2.jpg === File2-80q.jpg
File3.jpg === File3-80q.jpg
File4.jpg === File4-80q.jpg

Etc...

J'ai utilisé Phatch pour effectuer de telles tâches, mais ce que je souhaite, c'est juste un clic droit sur les fichiers sélectionnés et le traitement en une seule action.

Est-ce qu'il y a une meilleure façon de faire ça? ou ... Puis-je améliorer d'une certaine manière ce que je fais déjà?

Merci beaucoup pour votre soutient.

P.S. J'ai vu Comment puis-je convertir par lots des images au format n/b tout en préservant la structure du dossier et Existe-t-il un moyen d'exporter des fichiers SVG en lot au format PNG? mais je n'essaie pas de exécutez ceci depuis un terminal mais depuis un menu contextuel. Si j'omets quelque chose dans cet exercice, n'hésitez pas à me le faire savoir! Je l'apprécierai beaucoup. Je vous remercie!

Modifier

Après avoir utilisé réponse de mur , je trouve cette solution partiellement conforme à mes attentes.

Plus spécifiquement, cela résout le problème des noms de fichiers. Néanmoins, je m'attendais également à réduire la taille des fichiers en exécutant la commande convert file.jpg -quality 30% appropriée, qui supprime les tailles de fichier supérieures, comme vous pouvez le voir dans l'image suivante:

enter image description here

Est-ce que quelqu'un sait s'il y a quelque chose que je devrais ajouter aux paramètres vus dans réponse de Mur ? J'apprécie beaucoup vos efforts pour apporter une aide sur cette question.

Mise à jour

J'écris ceci juste pour que les gens sachent que j'ai vu où était le problème avec la compression. Le fichier que j'essayais de compresser était déjà suffisamment compressé (comme mentionné dans réponse de mur ):

Le processus consistait simplement à ajouter des frais généraux sans rien gagner.

6

Vous ne pouvez pas utiliser %F deux fois dans une commande comme celle-ci, car %F est remplacé par le nom de chaque fichier sélectionné. Par exemple, une commande de sh avec les paramètres -c 'printf "%%s\n" "$@" > foo' %F %F créera un fichier nommé foo avec les noms de chaque fichier sélectionné, deux fois. Par conséquent, la commande convert qui s'exécute est la suivante:

convert file1.jpg file2.jpg ... -quality 80% file1.jpg file2.jpg ... fileN.jpg-80q.jpg

Et puisque le dernier fichier est considéré comme le nom du fichier de sortie, seul celui-ci importera.

Ce que vous pouvez faire est d’envelopper votre commande dans bash -c et d’exécuter une boucle for:

bash -c 'for i; do convert "$i" -quality 80% "${i/%.jpg/-80q.jpg}"; done'

(où je suppose que tous les fichiers se terminent par .jpg)

Dans une action, vous aurez bash comme commande, et pour les paramètres:

-c 'for i; do convert "$i" -quality 80%% "${i/%%.jpg/-80q.jpg}"; done' - %F

Vous pouvez rendre cela plus compliqué à manipuler n'importe quelle extension, à quel point vous pouvez aussi ignorer les Actions et utiliser des scripts.

2
muru