【问题标题】:How to batch resize images in Ubuntu recursively within the terminal?如何在终端内递归地批量调整 Ubuntu 中的图像大小?
【发布时间】:2012-06-03 21:08:18
【问题描述】:

我有多个图像存储在一组有组织的文件夹中。我需要从它们的父目录将这些图像的大小重新调整为 递归的特定百分比。我正在运行 Ubuntu 11.10,我更喜欢直接从终端学习如何做到这一点。

【问题讨论】:

    标签: image ubuntu imagemagick ubuntu-11.10


    【解决方案1】:

    您可以使用imagemagick。例如,要将当前目录下的所有 JPG 图片调整为原始大小的 50%,您可以这样做:

    for f in `find . -name "*.jpg"`
    do
        convert $f -resize 50% $f.resized.jpg
    done
    

    生成的文件的名称中将包含两次“.jpg”。如果这是一个问题,您可以检查以下替代方案。

    对于遍历/查找要调整大小的文件,您也可以使用xargs。示例:

    find . -name "*.jpg" | xargs convert -resize 50%
    

    这将创建图像的副本。如果您只想将它​​们原地转换,您可以使用:

    find . -name "*.jpg" | xargs mogrify -resize 50%
    

    【讨论】:

    • 这是一个递归过程吗? f 是一个变量,$FILES 是文件的路径,对吧?
    • 问题提到“一组有组织的文件夹”。需要一个“发现”。
    • @CompilingCyborg 我更改了答案,以便它处理当前文件夹的子文件夹中的递归,查找所有 jpg 图像。
    • @horsh 谢谢,我现在意识到 OP 明确询问了一种处理递归的方法。我修复了包含递归的答案。
    • 很棒的剧本。如果使用 mogrify 请注意: mogrify -resize 50% $f 而不是 mogrify $f -resize 50%
    【解决方案2】:

    如果您提供新的调整大小分辨率,它也可以:

    convert $f.jpg -size 1024x768 $f.resized.png
    

    【讨论】:

      【解决方案3】:

      你也可以使用

      sudo apt install imagemagick
      sudo apt-get install nautilus-image-converter
      nautilus -q
      

      用于调整/旋转当前文件夹中的图像。您只需安装,然后右键单击一个或多个图像,然后选择您想要的大小,就是这样。 nautilus -q 是停止鹦鹉螺。只需重新启动 nautilus,即可使用图像转换器。

      【讨论】:

      • 像魅力一样工作。谢谢。
      • 嘿!这应该是公认的答案。使用起来非常方便。类似的答案在这里:askubuntu.com/questions/1053081/…
      • 我不知道为什么这没有得到更多的支持。我是一名程序员,对命令行很熟悉,但是当我只想调整一些图片的大小时,拥有 UI 比每次都查找 imagemagick 命令要容易得多
      【解决方案4】:

      您可以使用 imagemagick 工具批量调整大小。

      它会保持纵横比

      $ convert dragon.gif    -resize 64x64  resize_dragon.gif
      

      它不会保持纵横比

      $ convert dragon.gif    -resize 64x64\!  exact_dragon.gif
      
      $ cat resize.sh 
      #!/bin/bash
      for f in `find . -name "*.jpg"`
      do
          convert $f -resize 45x60\!  $f.resize.jpg
      done
      

      它将图像大小调整为 45x60,而不保持当前目录中的纵横比。

      【讨论】:

        【解决方案5】:

        从@betabandido 扩展答案

        如果图像所在的文件名或文件夹名称中有空格,则应将 -print0 与 find 一起使用,将 -0 与 xargs 一起使用,以避免任何解析错误。

        find . -name "*.jpg" -print0 | xargs -0 convert -resize 50%
        find . -name "*.jpg" -print0 | xargs -0 mogrify -resize 50%
        

        【讨论】:

        • 使用quality 也可以:find . -name "*.jpg" -print0 | xargs -0 mogrify -quality 70%
        【解决方案6】:

        有几个答案,例如:

        find . -name "*.jpg" | xargs convert -resize 50%
        

        这不起作用,因为它会像这样扩展列表: convert -resize 50% a.jpg b.jpg c.jpg 将在 c-0.jpg 中调整 a.jpg 的大小,在 c-1.jpg 中调整 b.jpg 并让 c.jpg 保持不变。

        因此,您必须为每个匹配项执行调整大小命令,并给出输入文件名和输出文件名,例如:

        find . -name "*.jpg" | xargs -n 1 sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')'
        

        find 的每个匹配项都由 xargs -n 1 单独传递给调整大小脚本:sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')'。 该脚本在参数$0 中接收文件名,使用sed 通过将原始.jpg 后缀替换为-th.jpg 来生成输出文件名。 它使用这两个文件名运行convert 命令。

        这里是没有xargs但有find -exec的版本:

        find -name '*.jpg' -exec sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')' {} \;
        

        【讨论】:

        • Mmmm... 使用此方法,您将必须创建一个新进程来为每个 JPEG 执行 sh,并创建一个新进程来为每个 JPEG 执行 sed 和为每个 JPEG 执行 convert 的新流程,如果您有很多图像,这会受到伤害。我建议使用mogrify,您只调用一次,它会从一个进程中处理所有图像,和/或使用 GNU Parallel,或者,至少使用 shell 参数替换而不是 sed 来计算新文件名.
        • 绝对的;使用mogrify,您无需制定第二个文件名,所有复杂性都消失了。我的观点是,mogrify 不适用convert,正如在几个答案中所写的那样。
        • 我的意思是 mogrifyconvert 不能简单地互换,正如在几个答案中所写的那样。当然;如果您可以覆盖原始文件,mogrify 会完成所有工作。如果你不这样做,那么你想使用convert,它会变得有点混乱。摆脱 sed,好主意:find -name '*.jpg' -exec sh -c 'convert -resize 50% $0 "${0%\.jpg}-th.jpg"' {} \; 或简单地通过前缀:“th-${0}”恕我直言,我不确定创建流程的成本与图像处理的任务相比是否重要......但我同意;为什么在不需要的时候创建一个新进程?
        猜你喜欢
        • 1970-01-01
        • 2012-07-17
        • 2014-04-19
        • 1970-01-01
        • 2018-12-22
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        • 2016-11-19
        相关资源
        最近更新 更多