如何批量减小JPEG图片的文件大小(/Mac)?

How to reduce the file size on JPEG images in batch (/Mac)?

我在 Mac 上有一个 .JPG 文件列表。我想将它们导出为每张图像占用少于 500 KB 的格式。 我知道如何使用预览应用程序一次处理一张图像;但我希望能够批量执行相同的操作,即同时处理多个文件。是否有命令行方式来执行此操作,以便我可以编写脚本并在终端中 运行 它? 或者我可以使用的其他方式?

这是一个命令行示例,使用 convert (brew info imagemagick) 将一个目录中的所有 *.jpg 图像转换为 .png:

$ for i in *.jpg; do
convert "$i" "${i%.jpg}.png"
done

要在 (dry-运行) 之前进行测试,您可以使用 echo 而不是 <command>:

$ for i in *.jpg; do
echo "$i" "${i%.jpg}.png"
done

这将在目录中搜索扩展名为 .jpg 的文件,然后执行命令 convert 将文件名 $i 作为参数传递,然后将同一文件用作输出名称删除扩展名并添加新的 .png,这是使用:

"${i%.jpg}.png"

双引号"的使用是为了案例文件可以包含空格,查看更多细节:shell parameter expansion

例如,要仅更改文件的质量,您可以使用:

convert "$i" -quality 80% "${i%.jpg}-new.jpg"

或者如果不需要保留原件:

mogrify -quality 80% *.jpg

The main difference is that ‘convert‘ tends to be for working on individual images, whereas ‘mogrify‘ is for batch processing multiple files.

安装ImageMagick. (Really.. it's lightweight and amazing) It's nice to install using Homebrew。那么...

  1. 打开终端。
  2. cd [FilepathWithImages] && mogrify -define jpeg:extent=60kb -resize 400 *.JPG
  3. 等到该过程完成(如果您有很多图像,可能需要几分钟)
  4. 要检查文件大小,请尝试 du -sh * 查看您所在目录中每个文件的大小。

注意:*.JPG 必须大写才能生效

这是如何工作的:
cd [yourfilepath] 将导航到您想要进入的目录
&& 用于链接命令
mogrify 当你想保持相同的文件名时使用
-define jpeg:extent=60kb 将最大文件大小设置为 60kb
-resize 400 将设置宽度
*.JPG 适用于您所在目录中的所有文件。

还有许多其他命令可用于 imagemagick convert 和 mogrify。安装后,您可以使用 man mogrify 查看可以链接到它的命令。

根据the docs、"Restrict the maximum JPEG file size, for example -define jpeg:extent=400KB. The JPEG encoder will search for the highest compression quality level that results in an output file that does not exceed the value. The -quality option also will be respected starting with version 6.9.2-5. Between 6.9.1-0 and 6.9.2-4, add -quality 100 in order for the jpeg:extent to work properly. Prior to 6.9.1-0, the -quality setting was ignored."

从 Homebrew 或 MacPorts 或 https://imagemagick.org/script/download.php#macosx 安装 ImageMagick。然后使用 mogrify 处理文件夹中的所有文件,使用 -define jpeg:extent=500KB 保存为 JPG.

我的桌面文件夹 test1 中有两个文件。处理会将它们放入我桌面上的文件夹 test2

Before Processing:

mandril.tif 3.22428MB (3.2 MB)
zelda.png 726153B (726 KB)

cd
cd desktop/test1
mogrify -path ../test2 -format jpg -define jpeg:extent=500KB *

After Processing:

mandril.jpg 358570B (359 KB)
zelda.jpg 461810B (462 KB)

https://imagemagick.org/Usage/basics/#mogrify

最后的*表示处理文件夹中的所有文件。如果您只想限制为 jpg,则将其更改为 *.jpg。 -format 表示您希望输出为 jpg。

免责声明:请小心,因为以下解决方案是 "DESTRUCTIVE" 命令,文件被直接替换为较低质量

既然您已经阅读了我的免责声明,我建议您获取 cwebp that you can download here

您还需要并行 sudo apt-get install -y parallel 然后我创造了以下脚本:

parallel cwebp {} -resize 0 640 -m 6 -sns 100 -q 80 -preset photo -segments 4 -f 100  -o {} ::: *.jpg && /
find -name "*.jpg" | parallel 'f="{}" ; mv -- {} ${f:0:-3}webp'

640 是生成的文件高度(以像素为单位),之前为 0 表示宽度将适应宽度和高度之间的比率。 我将质量降低到 80% (-q 80),你不会注意到有太大差异。

第二行查找所有已转换但仍具有错误扩展名文件 (.jpg) 的文件,因此它删除了最后 3 个字符 (jpg) 并添加了 webp。

我从每个文件 5 Mb 到大约 50k(.jpg 图像是 4000x4000 像素),只节省了 20 Gb 的存储空间。我希望你喜欢它!

如果您不想使用 webp 格式,您可以使用以下格式(您可能需要安装 imageMagick):

parallel convert {} -resize x640 -sampling-factor 4:2:0 -strip -quality 85 \
-interlace JPEG -colorspace RGB -define jpeg:dct-method=float {} ::: *.jpg