【问题标题】:jpegtran optimize without changing filenamejpegtran 优化而不更改文件名
【发布时间】:2011-04-07 09:53:18
【问题描述】:

我需要优化一些图像,但不要更改它们的名称。

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

但是,这似乎创建了 0 的文件大小。当我对不同的文件名执行此操作时,大小仍然完全相同。

【问题讨论】:

标签: linux image image-processing image-manipulation


【解决方案1】:

怎么样:

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

无论如何,我都不是 shell 专家,但我认为使用您的原始命令,一旦执行它,就会设置重定向,覆盖您的 image.jpg。然后当 jpegtran 尝试读取它时,它会找到一个空文件。

【讨论】:

  • 克莱门特请提供详细信息,这对我有用(显然也适用于海报。)
  • 好吧,Jpegtran 只接受 1 个参数,即原始文件名。像你一样给他第二个参数,让他抛出一个异常。此代码适用于 windows,但不适用于 linux。正如OP所说,您必须使用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)。
  • 天哪,我才意识到我输入了错误的命令,大约 5 次 -_-。这是有效的,我很抱歉。我编辑了答案以便能够支持你的答案 =)
  • 提醒其他人注意这个问题,这似乎适用于 jpegtran 的 8d 版本,但不适用于 6b。
【解决方案2】:

我使用这个脚本。完美运行。我希望这会有所帮助。

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 

【讨论】:

  • 谢谢,但是当在名称中带有空格的目录中运行时,脚本不起作用(这很糟糕,但确实发生了)。
  • @kursus 已修复。感谢您的报告
  • @iMos 谢谢!你救了我的一天! #!bin/bash 将修复 'Illegal option -d' 错误
【解决方案3】:

我做了三行:

jpegtran -optimize image.jpg > image.jpg-opt
cp image.jpg-opt image.jpg
rm image.jpg-opt

效果很好。

[edit:] 这一次只适用于一个文件。

【讨论】:

  • jpegtran -优化 image.jpg > image.jpg-opt && mv image.jpg-opt image.jpg
【解决方案4】:
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

【讨论】:

【解决方案5】:

没有海绵,另一种具有较低 HDD 或 SSD 写入访问权限的替代方法是使用 /dev/shm 保存临时文件,然后立即在本地覆盖它。

jpegtran -copy none -optimize image.jpg > /dev/shm/tmp.jpg &&  cat /dev/shm/tmp.jpg > ./image.jpg

这个概念可以很容易地适应任何脚本,也许需要注意临时文件名不相同,以避免在同时运行多个实例时发生冲突。考虑一些独特的文件名模式生成方案可能会很有趣,可能类似于${originalfilename}-jpgtrantmp-$$

【讨论】:

    【解决方案6】:

    如果不支持-outfile,则另一种选择:

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

    spongemoreutils 的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 2020-05-09
      相关资源
      最近更新 更多