mozcjpeg - 优化原始图像

时间:2017-04-25 11:58:14

标签: bash mozjpeg

我尝试使用mozcjpeg优化sample.jpg,但我希望它能压缩sample.jpg,而不是创建另一个文件。

我运行此命令:

mozcjpeg -quality 80 sample.jpg > sample.jpg

我得到了

Empty input file

做正确的方法是什么?

P.S。我有一个每天运行一次的bash脚本来优化过去24小时内创建的图像。

3 个答案:

答案 0 :(得分:0)

只需使用不同的输出文件名,否则会立即覆盖。

答案 1 :(得分:0)

您正在读取文件并同时覆盖它。而是制作一个中间文件:

tmp_file="$(mktemp)"
mozcjpeg -quality 80 sample.jpg > "${tmp_file}"
mv "${tmp_file}" sample.jpg

答案 2 :(得分:0)

anycmd foo.jpg > foo.jpg被理解为:

  • 该外壳程序将打开foo.jpg进行写入(覆盖所有现有数据)。
  • shell会派生并将此打开的文件设置为stdout。
  • shell将执行anycmd foo.jpg

因此,在执行命令时,原始文件已经消失了。您该如何解决?

好吧,您可以创建一个临时文件as suggested in the other answer

或者,您可以使用sponge。它是moreutils软件包的一部分。

$ whatis sponge
sponge (1)           - soak up standard input and write to a file

该工具允许您编写:

mozcjpeg -quality 80 sample.jpg | sponge sample.jpg

之所以起作用,是因为sponge将首先读取所有(内存中的)stdin,并且只有在stdin到达EOF之后,它才会打开文件进行写入。