我需要优化一些图片,但不要更改名称。
jpegtran -copy none -optimize image.jpg > image.jpg
但是,这似乎创建了一个0.的文件大小。当我使用不同的文件名时,大小仍然完全相同。
答案 0 :(得分:25)
怎么样:
jpegtran -copy none -optimize -outfile image.jpg image.jpg
我无论如何都不是shell专家,但我认为使用您的原始命令,只要执行它,就会设置重定向,覆盖您的image.jpg。然后,当jpegtran尝试读取它时,它会找到一个空文件。
答案 1 :(得分:10)
我使用这个脚本。工作完美无瑕。我希望这会有所帮助。
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
答案 2 :(得分:2)
我分三行完成:
jpegtran -optimize image.jpg > image.jpg-opt
cp image.jpg-opt image.jpg
rm image.jpg-opt
运作良好。
[edit:]一次仅适用于一个文件。
答案 3 :(得分:2)
jpegtran -copy none -progressive -optimize -outfile filename filename
对于全面优化: -copy none 告诉jpegtran禁止源jpeg中存在的所有评论和其他超重行李,渐进式会生成渐进式jpeg, - optimize 执行实际优化, -outfile 设置输出文件名。最后一个参数是输入文件名:如果它们相同,则会对文件进行优化。
编辑:根据有关无损jpeg压缩工具http://blarg.co.uk/blog/comparison-of-jpeg-lossless-compression-tools
的文章,您可能还想尝试使用mozjpeg答案 4 :(得分:1)
没有海绵,另一种具有较低HDD或SSD写入权限的替代方案是使用/ dev / shm保存临时文件,然后立即在本地覆盖它。
jpegtran -copy none -optimize image.jpg > /dev/shm/tmp.jpg && cat /dev/shm/tmp.jpg > ./image.jpg
该概念可以很容易地适应任何脚本,可能有关于临时文件名不一致的警告,以避免在同时运行多个实例时发生冲突。考虑一些独特的文件名模式生成方案可能很有意思,可能与${originalfilename}-jpgtrantmp-$$
的内容类似。
答案 5 :(得分:0)