首先:感谢您花时间阅读本文并提供帮助。任何建议都值得感激。
我正在使用 Nautilus-Actions 添加自定义上下文菜单的操作来创建 JPG 图像的副本并降低其质量(和文件大小),同时保留图像的尺寸。
假设我有一张文件大小为 2.3 MB (2 261 588 字节) 的图片,并且:
在 GIMP 2.8 中打开文件后,仅导出副本并使用 JPG 导出对话框将图像质量降低至 30%:
我在图像副本(251.8 kB(251 797 字节)文件大小)中获得这些属性:
我使用 Nautilus Actions 批量处理大量图像,通过上下文菜单重现相同的行为,方法是在 Nautilus 中选择一组文件,右键单击这些选定文件中的任何一个,然后选择适当的 Nautilus Actions 操作。结果是包含与原始图像相同尺寸的文件,当然质量较低,文件大小稍大(文件大小为 275.3 kB(275 265 字节)),但这对我来说不是什么大问题。
当我尝试批量处理多个图像文件时,就会出现问题,导致第一个文件名被克隆成几个文件名,每个文件名包含不同的图像。使用我在这组命令中设置的属性:
基本上,每个 Nautilus Action 都使用以下参数:
命令: convert
- 来自(imagemagick)
参数: %F.jpg -quality 80%% %F-80q.jpg
- 其解释为:
convert path/to/file1.mid.jpg -quality=80% path/to/file1.mid-80q.jpg
工作目录: %d
因此,结果是:
在这里,我们可以看到每个图像都在不同的文件中处理,但只使用第一个文件名为复制的文件分配新名称。我想要的结果如下:
File1.jpg === File1-80q.jpg
File2.jpg === File2-80q.jpg
File3.jpg === File3-80q.jpg
File4.jpg === File4-80q.jpg
等等...
我曾使用 Phatch 来执行此类任务,但我想要的只是右键单击选定的文件并通过单个操作进行处理。
有没有更好的方法来做到这一点?或者...我可以以某种方式改进我正在做的事情吗?
非常感谢您的支持。
PS我已经看到了如何在保留文件夹结构的情况下批量将图像转换为黑白图像和有没有办法将 SVG 批量导出为 PNG?但我不是想从终端运行它,而是从上下文菜单运行它。如果我在这个练习中遗漏了什么,请随时告诉我!我会非常感激。谢谢!
编辑
使用后muru 的回答我发现该解决方案部分满足了我的预期。
更具体地说,它解决了文件名问题。不过,我还希望通过运行正确的convert file.jpg -quality 30%
命令来获得较小的文件大小,但它却减少了较大的文件大小,正如您所看到的:
有人知道我是否应该在参数中添加其他内容吗?muru 的回答? 我非常感谢您为此问题提供的帮助。
更新
我写这篇文章只是为了让人们知道我已经知道压缩的问题出在哪里。我试图压缩的文件已经完全压缩,因此(如muru 的回答):
这个过程只是增加了开销而没有任何好处。
答案1
您不能%F
在这样的命令中使用两次,因为%F
会被每个选定文件的名称替换。例如,sh
带有参数的命令-c 'printf "%%s\n" "$@" > foo' %F %F
将创建一个foo
以每个选定文件的名称命名的文件,两次。因此convert
实际运行的命令是:
convert file1.jpg file2.jpg ... -quality 80% file1.jpg file2.jpg ... fileN.jpg-80q.jpg
并且由于最后一个文件被视为输出文件名,因此只有它才重要。
您可以做的是包装您的命令bash -c
并运行 for 循环:
bash -c 'for i; do convert "$i" -quality 80% "${i/%.jpg/-80q.jpg}"; done'
(我假设所有文件都以 结尾.jpg
)
在一个动作中,你将拥有bash
以下命令和以下参数:
-c 'for i; do convert "$i" -quality 80%% "${i/%%.jpg/-80q.jpg}"; done' - %F
您可以使其变得更加复杂以处理任何扩展,此时您也可以跳过操作并使用脚本。