【发布时间】:2011-04-07 09:53:18
【问题描述】:
我需要优化一些图像,但不要更改它们的名称。
jpegtran -copy none -optimize image.jpg > image.jpg
但是,这似乎创建了 0 的文件大小。当我对不同的文件名执行此操作时,大小仍然完全相同。
【问题讨论】:
标签: linux image image-processing image-manipulation
我需要优化一些图像,但不要更改它们的名称。
jpegtran -copy none -optimize image.jpg > image.jpg
但是,这似乎创建了 0 的文件大小。当我对不同的文件名执行此操作时,大小仍然完全相同。
【问题讨论】:
标签: linux image image-processing image-manipulation
怎么样:
jpegtran -copy none -optimize -outfile image.jpg image.jpg
无论如何,我都不是 shell 专家,但我认为使用您的原始命令,一旦执行它,就会设置重定向,覆盖您的 image.jpg。然后当 jpegtran 尝试读取它时,它会找到一个空文件。
【讨论】:
jpegtran -copy none -optimize -outfile image.jpg > newimage.jpg,但是,它不是文件替换。精度:我在 Ubuntu/Jpegtran 版本 8b 上对其进行了测试,也许其他版本可以与您的代码一起使用。
jpegtran -optimize image.jpg > image.jpg 也不起作用,因为 linux 首先清除并重新创建 image.jpg (> image.jpg),然后才 启动命令 (jpegtran -optimize image.jpg)。
我使用这个脚本。完美运行。我希望这会有所帮助。
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
用法一:
optimize-images.sh /images/dir
用法2:
cd /images/dir
optimize-images.sh
【讨论】:
我做了三行:
jpegtran -optimize image.jpg > image.jpg-opt
cp image.jpg-opt image.jpg
rm image.jpg-opt
效果很好。
[edit:] 这一次只适用于一个文件。
【讨论】:
jpegtran -copy none -progressive -optimize -outfile filename filename
为了全面优化:-copy none 告诉 jpegtran 抑制源 jpeg 中存在的所有 cmets 和其他多余的包袱,progressive 生成渐进 jpeg,- optimize 执行实际的优化,-outfile 设置输出文件名。最后一个参数是输入文件名:如果它们相同,则您的文件已就地优化。
编辑:您可能还想尝试 mozjpeg,根据这篇关于无损 jpeg 压缩工具的文章 http://blarg.co.uk/blog/comparison-of-jpeg-lossless-compression-tools
【讨论】:
-progressive 是一个好主意 - blog.patrickmeenan.com/2013/06/progressive-jpegs-ftw.html
没有海绵,另一种具有较低 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 的一部分。
【讨论】: