如何仅调整丢失的图像大小?

如何仅调整丢失的图像大小?

我有一个包含 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)来显示调整大小的文件的名称。

从技术上讲,该命令是一行(显示连续行以避免滚动)。
而且,经过这样的解释,不知怎的,我觉得这句话仍然不太好读……

相关内容