我有一个包含 10,000 个 JPEG 的目录。我在生成文件时犯了一个错误,现在有些是 720px × 480px,但它们应该都是 448px × 336px。该目录包含太大的文件和正确大小的 448px × 336px。它们需要具有相同的尺寸,因此我需要将 720px × 480px 图像缩小到正确的 448px × 336px。
- 每个文件必须为 448px × 336px。
- 由于有 10,000 个文件,因此很难检查每个文件以确定哪些文件太大。
有没有办法使用 ImageMagick 或类似的批处理工具来有选择地仅调整那些尺寸错误的图像的大小?
答案1
您可以使用以下命令找到宽度为 720 像素的文件:
identify -format '%w %i\n' *.jpg | awk '/^720/ {print $2}'
如果确实有很多文件可能导致 *.jpg 扩展,从而出现可怕的“参数列表太长”错误,则可以使用此变体:
find -name '*.jpg' -exec identify -format '%w %i\n' {} + | awk '/^720/ {print $2}'
使用该列表,您可以调整这些文件的大小,例如:
find -name '*.jpg' -exec identify -format '%w %i\n' {} + | awk '/^720/ {print $2}' | xargs -I {} convert -resize 488x336! {} {}
感叹号!在 488x336 强制新图像完全符合该尺寸之后;如果没有它,纵横比将被保留,并且给定的尺寸是宽度和高度的最大尺寸。
答案2
人们可以希望
convert in.jpg -resize "448x336!" out.jpg
如果大小已经正确,就不会触摸该文件吗?
不幸的是不是 - 但考虑一下 imagemagic 命令行格式的工作方式,这并不奇怪。
因此需要首先检查每个文件的图像尺寸。现在,我们想要使用 ImageMagic,它具有identify
用于此目的的命令;
identify -format "%wx%h\n" file.jpg
仅以格式显示大小WxH
,例如448x336
.
如果尺寸不是448x336
,我们想要调整尺寸。在这种情况下,我们使用convert
调整大小448x336
- 我们必须告诉convert
我们想要调整大小,即使这意味着更改纵横比以强制图像达到新的尺寸 - 我们通过!
在大小中添加 a 作为选项/标志来做到这一点规格:
convert in.jpg -resize "448x336!" out.jpg
做我们需要的调整大小。但我们没有输出的固定文件名。让我们采用原始名称并-res
在 之前插入.jpg
,例如in-res.jpg
:
convert in.jpg -resize "448x336!" -set filename:path "%d/%t-res.%e" "%[filename:path]"
我们使用命令find
遍历目录 '.jpg'图像 - 或“.JPG"。该identify
部分在 shell 中运行以使用test
命令[ ... ]
。我还使用 shell 作为convert
命令,如果第一个-exec
操作(非选项)成功,则运行该命令。在这种情况下,只需在调整大小,为每个调整大小的文件显示一条消息。
find . -type f -iname "*.jpg" -exec bash -c \
'[ $(identify -format "%wx%h\n" "{}") != 448x336 ]' \; -exec bash -c \
'convert "{}" -resize "448x336!" -set filename:path "%d/%t-res.%e" \
"%[filename:path]" ; echo "Resized {}"' \;
bash
可以使用 plain代替第二个-exec convert ...
,并添加一个新操作(例如-print
或-ls
)来显示调整大小的文件的名称。
从技术上讲,该命令是一行(显示连续行以避免滚动)。
而且,经过这样的解释,不知怎的,我觉得这句话仍然不太好读……