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

首先:感谢您抽出宝贵时间阅读本文并提供帮助。 任何建议表示赞赏。

我正在使用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的回答中所提到的 ):

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

您不能在命令中使用%F两次,因为%F会被所选的每个文件的名称替换。 例如,带参数-c 'printf "%%s\n" "$@" > foo' %F %Fsh命令将创建一个名为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 

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