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.

16
demandé sur Kornel 2011-04-07 13:53:18

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.

24
répondu so12311 2011-05-31 08:58:06

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 
9
répondu imos 2015-09-25 14:58:02

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.

2
répondu ZurabWeb 2014-06-09 16:37:58
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

2
répondu Mauro Colella 2014-10-29 07:06:45

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-$$.

1
répondu Jay Pegg 2017-07-23 08:22:55

une autre option si -outfile n'est pas pris en charge:

jpegtran -copy none -optimize image.jpg | sponge image.jpg

sponge moreutils.

0
répondu Jackson Pauls 2015-12-13 10:59:04