您可以使用 ImageMagick 执行此操作,但很难明确说明使用哪种方式执行此操作,因为这取决于所有文件是否都在同一目录中,以及您是否拥有或可以使用 GNU Parallel。
通常,您可以像这样将单个图像的大小减小到 500 的特定宽度:
# Resize image to 500 pixels wide
convert input.jpg -resize 500x result.jpg
Run Code Online (Sandbox Code Playgroud)
其中input.jpg
和result.jpg
被允许是同一个文件。如果你想做高度,你可以使用:
# Resize image to 500 pixels high
convert input.jpg -resize x500 result.jpg
Run Code Online (Sandbox Code Playgroud)
因为尺寸被指定为width x height
.
如果您只想缩小大于 500 像素的文件,而不进行任何放大(增加分辨率),请添加>
维度:
# Resize images wider than 500 pixels down to 500 pixels wide
convert image.jpg -resize '500x>' image.jpg
Run Code Online (Sandbox Code Playgroud)
如果要减小结果的文件大小,必须使用a-define
来引导JPEG编码器,如下所示:
# Resize image to no more than 500px wide and keep output file size below 50kB
convert image.jpg -resize '500x>' -define jpeg:extent=50KB result.jpg
Run Code Online (Sandbox Code Playgroud)
所以,现在你需要对所有文件进行循环:
#!/bin/bash
shopt -s nullglob
shopt -s nocaseglob
for f in *.jpg; do
convert "$f" -resize '500x>' -define jpeg:extent=50KB "$f"
done
Run Code Online (Sandbox Code Playgroud)
如果您喜欢处理所有 CPU 内核,请使用 GNU Parallel 执行此操作以更快地完成工作。
请注意,如果您的文件小于 500px 宽,ImageMagick 将不会处理它,因此如果它小于 500 像素宽且大于 50kB,则文件大小不会减少。为了捕捉这种不太可能的边缘情况,您可能需要在find
之后运行另一个以查找超过 50kB 的任何文件,然后运行它们convert
但没有-resize
,如下所示:
find . -type f -iname "*.jpg" -size -51200c -exec convert {} -define jpeg:extent=50KB {} \;
Run Code Online (Sandbox Code Playgroud)