Utilisez mogrify pour redimensionner des fichiers volumineux tout en ignorant les petits
10
J'exécute la commande suivante:
mogrify -resize '400x400>' *.png
Remarquez le ">". Soi-disant, il ignorera les fichiers plus petits, mais bien qu'il ne les redimensionne pas, il les modifie (la date de modification et la taille du fichier sont modifiées).
Existe-t-il un moyen de faire en sorte de laisser les petits fichiers seuls? Je voudrais éviter plusieurs milliers d'opérations d'écriture inutiles.
Je pense que mogrifyréécrit systématiquement le fichier, donc votre seul espoir est de filtrer la liste en premier, comme suggéré par jippie . Voici comment vous pouvez le faire (non testé): imprimez une liste de fichiers image avec une indication de taille, ne conservez que les noms dont la taille associée est dans la plage et traitez cette liste.
Pour chaque fichier, imprimez une ligne avec la largeur, un espace, la hauteur, un espace et le nom du fichier. Selon votre version de identify, l' \najout d'une nouvelle ligne finale peut être nécessaire (ImageMagick 6.6.0) ou superflu mais inoffensif (GraphicsMagick 1.1.11).
( awk) Sur chaque ligne, si la largeur ( $1) et la hauteur ( $2) correspondent aux conditions requises, alors:
Supprimez tout le texte jusqu'au deuxième caractère d'espace. Cela enlève la largeur et la hauteur.
Imprimez ce qui reste de la ligne, qui est le nom du fichier.
Remplacez les retours à la ligne par des caractères nuls.
Appelez xargs -0pour exécuter la mogrifycommande sur les noms de fichiers. (Nous ne pouvons pas utiliser plain xargscar il ne peut pas traiter les entrées contenant des espaces ou \'".)
Les noms de fichiers peuvent contenir n'importe quel caractère sauf les sauts de ligne.
pouvez-vous expliquer ce script? Plus précisément la partie "sous". Il s'agit d'imprimer les noms de fichiers sans espace ou d'insérer une nouvelle ligne. mogrify: impossible d'ouvrir le fichier `22 553.png308 400 0134 2.png '@ error / png.c / ReadPNGImage / 2951. Je ne sais pas d'où vient ce "308 400". Je dois mentionner que les fichiers ont des espaces dans leurs noms Merci.
Mike
Je reçois Mogrify: impossible d'ouvrir le fichier `340271 22 553.png308 400 0134 2.png '@ error / png.c / ReadPNGImage / 2951. J'ai exécuté la commande en utilisant 200x200 sur deux fichiers d'exemple. Je vois que 308x400 est la taille d'un des fichiers
Mike
2
@ Mike Ah, j'ai compris. Certaines versions de identifymettent automatiquement une nouvelle ligne après chaque enregistrement, d'autres doivent en avoir une explicitement. Ajoutez \nà la fin de l'argument à -format(voir ma modification).
Gilles 'SO- arrête d'être méchant'
8
J'ai fait face au même problème que vous avez décrit. Voici ma solution:
#!/bin/bash
files=*.jpg
minimumWidth=640
minimumHeight=640for f in $files
do
imageWidth=$(identify -format "%w""$f")
imageHeight=$(identify -format "%h""$f")if["$imageWidth"-gt "$minimumWidth"]||["$imageHeight"-gt "$minimumHeight"];then
mogrify -resize ''"$minimumWidth"x"$minimumHeight"'' $f
fidone
Je l'ai testé sur plusieurs images JPEG sur une machine CentOS 6.5 virtualisée. Le script a uniquement redimensionné et compressé les images dont la largeur ou la hauteur était supérieure à 640 pixels. Cela l'a fait fonctionner pour des images avec des dimensions comme 800 x 600 (paysage, le redimensionnement à 640 x 480) et des dimensions comme 600 x 800 (portrait, le redimensionnement à 480 x 640).
PS: Remarque sur le 400x400paramètre: mogrifytraitera le fichier même si ses dimensions sont égales ou inférieures à 400x400, mais ne sera redimensionné que si ses dimensions sont supérieures à 400x400. C'est pourquoi le temps et la taille de modification des fichiers sont modifiés (dans mon cas, ont mogrifyrendu ces fichiers encore plus grands qu'ils ne l'étaient).
sortira 1si l'image est plus grande que 400x400et 0si elle est égale ou inférieure à 400x400...
En supposant des noms de fichiers sensés (pas de sauts de ligne / espaces / tabulations, etc.), vous pouvez utiliser identifypour imprimer les noms d'images précédés de 1:ou 0:, traiter la sortie en supprimant les lignes qui commencent par 0:et en supprimant le début 1:des autres lignes afin que seuls les noms de fichiers restent, un par ligne, puis dirigez cette liste vers mogrify ... @-(la @syntaxe a été ajoutée imagemagick v6.5.2):
Sinon, avec findvous pourriez imprimer uniquement les fichiers avec une taille> 400x400 puis diriger le résultat vers xargs+ mogrify(c'est moins efficace car il exécute un shell pour chaque fichier mais cela devrait fonctionner avec toutes sortes de noms de fichiers):
Que diriez-vous d'utiliser identifier pour trouver la taille de votre image et décider à partir d'un petit script si vous souhaitez la modifier ou non:
Compte tenu de mes compétences limitées et du fait que les tailles des images sont si irrégulières, j'ai besoin d'une méthode plus simple. Je préfère les traiter tous avec mogrify.
Mike
0
J'utilise un tel script PHP, il utilise ImageMagick:
Voici mon point de vue, intégrant les idées de @ArionKrause et @don_crissti:
#!/bin/bash
# adapted from http://unix.stackexchange.com/a/157594/110635
# and http://unix.stackexchange.com/a/220619/110635
W=1024
H=768
SIZE_TEST="%[fx:(h>$H && w>$W)]"'\n'
for f in $*; do
if [ $(identify -format "$SIZE_TEST" "$f") = 1 ]; then
echo "Resize: $f"
mogrify -resize ''"$W"x"$H"'' "$f"
else
echo "Do not resize: $f"
fi
done
(J'en avais besoin parce que mon processeur par lots préféré Phatch ne fonctionne pas avec Ubuntu 16.04.)
identify
mettent automatiquement une nouvelle ligne après chaque enregistrement, d'autres doivent en avoir une explicitement. Ajoutez\n
à la fin de l'argument à-format
(voir ma modification).J'ai fait face au même problème que vous avez décrit. Voici ma solution:
Je l'ai testé sur plusieurs images JPEG sur une machine CentOS 6.5 virtualisée. Le script a uniquement redimensionné et compressé les images dont la largeur ou la hauteur était supérieure à 640 pixels. Cela l'a fait fonctionner pour des images avec des dimensions comme 800 x 600 (paysage, le redimensionnement à 640 x 480) et des dimensions comme 600 x 800 (portrait, le redimensionnement à 480 x 640).
PS: Remarque sur le
400x400
paramètre:mogrify
traitera le fichier même si ses dimensions sont égales ou inférieures à 400x400, mais ne sera redimensionné que si ses dimensions sont supérieures à 400x400. C'est pourquoi le temps et la taille de modification des fichiers sont modifiés (dans mon cas, ontmogrify
rendu ces fichiers encore plus grands qu'ils ne l'étaient).la source
Vous pouvez également utiliser l'
fx
opérateur pour filtrer les images en fonction de la hauteur / largeur, par exemplesortira
1
si l'image est plus grande que400x400
et0
si elle est égale ou inférieure à400x400
...En supposant des noms de fichiers sensés (pas de sauts de ligne / espaces / tabulations, etc.), vous pouvez utiliser
identify
pour imprimer les noms d'images précédés de1:
ou0:
, traiter la sortie en supprimant les lignes qui commencent par0:
et en supprimant le début1:
des autres lignes afin que seuls les noms de fichiers restent, un par ligne, puis dirigez cette liste versmogrify ... @-
(la@
syntaxe a été ajoutéeimagemagick v6.5.2
):Sinon, avec
find
vous pourriez imprimer uniquement les fichiers avec une taille> 400x400 puis diriger le résultat versxargs
+mogrify
(c'est moins efficace car il exécute un shell pour chaque fichier mais cela devrait fonctionner avec toutes sortes de noms de fichiers):Si vous êtes un
zsh
utilisateur, voyez également cette réponse .la source
Que diriez-vous d'utiliser identifier pour trouver la taille de votre image et décider à partir d'un petit script si vous souhaitez la modifier ou non:
Il ne devrait pas être trop difficile de modifier le format de sortie pour l'utiliser dans un script simple.
la source
J'utilise un tel script PHP, il utilise ImageMagick:
Il met à l'échelle toutes les images du répertoire actuel supérieures à 3000 sur un certain bord.
Exécuter la commande:
php scale.php
OUphp scale.php 2000
la source
Voici mon point de vue, intégrant les idées de @ArionKrause et @don_crissti:
(J'en avais besoin parce que mon processeur par lots préféré Phatch ne fonctionne pas avec Ubuntu 16.04.)
la source
Mes fonctions pour redimensionner et optimiser
la source