jpegtran优化而不改变文件名

时间:2011-04-07 09:53:18

标签: linux image image-processing image-manipulation

我需要优化一些图片,但不要更改名称。

jpegtran -copy none -optimize image.jpg > image.jpg 

但是,这似乎创建了一个0.的文件大小。当我使用不同的文件名时,大小仍然完全相同。

6 个答案:

答案 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)

不支持-outfile的另一个选项:

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

spongemoreutils的一部分。