一部の画像を最適化する必要がありますが、名前は変更しません。
jpegtran -copy none -optimize image.jpg > image.jpg
ただし、これによりファイルサイズが0になるようです。別のファイル名でファイルサイズを変更しても、サイズはまったく同じです。
どうですか:
jpegtran -copy none -optimize -outfile image.jpg image.jpg
私は決してシェルの専門家ではありませんが、元のコマンドを実行するとすぐに、image.jpgを上書きするリダイレクトが設定されると思います。次に、jpegtranがそれを読み取ろうとすると、空のファイルが見つかります。
このスクリプトを使用します。完璧に動作します。これがお役に立てば幸いです。
https://Gist.github.com/iimos/7424025
#! /bin/sh
EXTENSIONS="jpe?g"
if [ -z "$1" ]; then
DIR="`pwd`"
else
DIR="$1"
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 $'\0' file; do
chown $(stat -c "%U:%G" "${file%.optimized}") "$file"
chmod $(stat -c "%a" "${file%.optimized}") "$file"
mv -f "$file" "${file%.optimized}";
done
使用法1:
optimize-images.sh /images/dir
使用法2:
cd /images/dir
optimize-images.sh
jpegtran -copy none -progressive -optimize -outfile filename filename
包括的な最適化の場合:-copy noneは、ソースjpegに存在するすべてのコメントおよびその他の超過手荷物を抑制するようにjpegtranに指示しますプログレッシブはプログレッシブjpegを生成し、-optimizeは実際の最適化を実行し、 -outfileは、出力ファイル名を設定します。最後のパラメータは入力ファイル名です。同じ場合、ファイルはその場で最適化されます。
編集:ロスレスjpeg圧縮ツールに関するこの記事によると、mozjpegも試してみてください http://blarg.co.uk/blog/compareson-of-jpeg-lossless-compression-tools
私は3行でそれをしました:
jpegtran -optimize image.jpg > image.jpg-opt
cp image.jpg-opt image.jpg
rm image.jpg-opt
うまく機能します。
[編集:]これは、一度に1つのファイルに対してのみ機能します。
スポンジを使用しない場合、HDDまたはSSDの書き込みアクセスが少ない別の方法は、/ dev/shmを使用して一時ファイルを保存し、すぐにローカルで上書きすることです。
jpegtran -copy none -optimize image.jpg > /dev/shm/tmp.jpg && cat /dev/shm/tmp.jpg > ./image.jpg
複数のインスタンスが同時に実行されている場合の衝突を回避するために、この概念は、一時ファイル名が同じでないことに関する警告を含めて、任意のスクリプトに簡単に適合させることができます。おそらく${originalfilename}-jpgtrantmp-$$
に沿った、独自のファイル名パターン生成スキームについて考えるのは興味深いかもしれません。
-outfile
がサポートされていない場合の別のオプション:
jpegtran -copy none -optimize image.jpg | sponge image.jpg
sponge
は moreutils の一部です。