如何使用 Nautilus-Actions 批量处理 JPG 图像以更改其质量?

Gep*_*nzo 7 command-line nautilus gimp image-processing nautilus-actions

首先:感谢您花时间阅读本文并提供一些帮助。任何建议表示赞赏。

我正在使用 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 操作对话框

基本上,每个 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
Run Code Online (Sandbox Code Playgroud)

等等...

我已经使用 Phatch 来完成这些任务,但我想要的是只需右键单击所选文件并在单个操作中进行处理。

有没有更好的方法来做到这一点?或者...我可以以某种方式改进我已经在做的事情吗?

非常感谢您的支持。

PS我已经看到了我怎么能批量转换图像的B / W,同时保留文件夹结构有没有一种方法来批量出口到SVGs PNG图像?但我不是试图从终端而是从上下文菜单中运行它。如果我在此练习中遗漏了某些内容,请随时告诉我!我会很感激的。谢谢!

编辑

使用muru 的答案后,我发现该解决方案部分符合我的预期。

更具体地说,它解决了文件名问题。尽管如此,我也希望通过运行正确的convert file.jpg -quality 30%命令来获得更小的文件大小,并且如您所见,它正在删除更大的文件大小:

文件大小

有谁知道我是否应该在muru 的回答中看到的参数中添加其他内容?我非常感谢您在此问题上提供帮助的努力。

更新

我写这篇文章只是为了让人们知道我已经看到了压缩的问题所在。我试图压缩的文件已经完全压缩了(如muru 的回答中所述):

这个过程只是增加了开销而没有获得任何东西。

mur*_*uru 4

您不能%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
Run Code Online (Sandbox Code Playgroud)

由于最后一个文件被视为输出文件名,因此只有它才重要。

您可以做的是将命令包装起来bash -c并运行 for 循环:

bash -c 'for i; do convert "$i" -quality 80% "${i/%.jpg/-80q.jpg}"; done'
Run Code Online (Sandbox Code Playgroud)

(我假设所有文件都以 结尾.jpg

在操作中,您将拥有bash以下命令和参数:

-c 'for i; do convert "$i" -quality 80%% "${i/%%.jpg/-80q.jpg}"; done' - %F
Run Code Online (Sandbox Code Playgroud)

您可以使处理任何扩展变得更加复杂,此时您不妨跳过操作并使用脚本。