jpegtran optimise sans changer le nom du fichier
j'ai besoin d'optimiser certaines images, mais pas de changer de nom.
jpegtran -copy none -optimize image.jpg > image.jpg
Toutefois, cela semble créer une taille de 0. Quand je le fais à un autre nom de fichier, la taille est toujours exactement la même.
6 réponses
Que diriez-vous de:
jpegtran -copy none -optimize -outfile image.jpg image.jpg
Je ne suis en aucun cas un expert shell, mais je pense qu'avec votre commande originale, dès qu'elle est exécutée, la redirection est configurée qui écrase votre image.jpg. Puis, lorsque jpegtran essaie de le lire, il trouve un fichier vide.
j'utilise ce script. Fonctionne parfaitement. J'espère que cette aide.
https://gist.github.com/iimos/7424025
#! /bin/sh
EXTENSIONS="jpe?g"
if [ -z "" ]; then
DIR="`pwd`"
else
DIR=""
fi
# Optimize JPEG images
find "$DIR" -regextype posix-egrep -regex ".*\.($EXTENSIONS)$" -type f | xargs -I{} jpegtran -optimize -progressive -outfile "{}.optimized" "{}"
# Rename xxx.jpg.optimized -> xxx.jpg
find "$DIR" -name '*.optimized' -print0 | while read -d $'' file; do
chown $(stat -c "%U:%G" "${file%.optimized}") "$file"
chmod $(stat -c "%a" "${file%.optimized}") "$file"
mv -f "$file" "${file%.optimized}";
done
Utilisation 1:
optimize-images.sh /images/dir
Utilisation 2:
cd /images/dir
optimize-images.sh
je l'ai fait en trois lignes:
jpegtran -optimize image.jpg > image.jpg-opt
cp image.jpg-opt image.jpg
rm image.jpg-opt
Fonctionne bien.
[edit:] cela ne fonctionne que pour un fichier à la fois.
jpegtran -copy none -progressive -optimize -outfile filename filename
pour une optimisation globale:-copie none dit à jpegtran de supprimer tous les commentaires et autres bagages excédentaires présents dans la source jpeg,progressif génère un jpeg progressif, -optimiser effectue les optimisations réelles, et définit le nom du fichier de sortie. Le dernier paramètre est le nom du fichier d'entrée: s'ils sont identiques, votre fichier est optimisé en place.
Edit: vous pouvez vous voulez aussi essayer mozjpeg, selon cet article sur lossless jpeg compression tools http://blarg.co.uk/blog/comparison-of-jpeg-lossless-compression-tools
sans éponge, une autre alternative avec un accès d'écriture HDD ou SSD inférieur est d'utiliser le fichier /dev/shm pour enregistrer le fichier temporaire et ensuite l'écraser localement immédiatement.
jpegtran -copy none -optimize image.jpg > /dev/shm/tmp.jpg && cat /dev/shm/tmp.jpg > ./image.jpg
le concept peut être facilement adapté dans n'importe quel script, peut-être avec des mises en garde sur le fait que le nom de fichier temporaire n'est pas le même, afin d'éviter les collisions s'il y a plusieurs instances en cours d'exécution en même temps. Il est peut-être intéressant de penser à un schéma unique de génération de noms de fichiers., peut-être quelque chose le long des lignes de ${originalfilename}-jpgtrantmp-$$
.
une autre option si -outfile
n'est pas pris en charge:
jpegtran -copy none -optimize image.jpg | sponge image.jpg
sponge
moreutils.