【问题标题】:Flipping every other picture in a directory翻转目录中的所有其他图片
【发布时间】:2012-11-14 03:47:07
【问题描述】:

我有一堆图片要打印,但为了让它们正确打印出来,其他每张图片都需要水平翻转。现在,这些图片都是 png 文件,并标有"Foo 001.png""Foo 002.png"。我在想我需要做的就是查看字符串中包含数字的部分,将其转换为整数,执行n%2==0 以检查它是否是偶数,如果是偶数则翻转它。

我不知道是否有一种方便的方法可以使用 bash 将字符串转换为整数,或者我会用什么来翻转图片。

【问题讨论】:

  • 不,只是有一个变量,您在迭代文件时不断切换,然后不依赖文件命名约定。 X=0 ; ... ; do X=$((1-$X)) ; if [ $X -eq 1 ] ; then ... fi; ... done
  • 不确定我是否理解。你想翻转 1/2 图像吗?翻转是指旋转吗?
  • @vladr 这可能会更容易,但我怎么知道文件将以什么顺序迭代?会按字母顺序排列吗?
  • @russjohnson09 lsglob 等将按字母顺序进行。由您决定是否提出正确排序的列表。

标签: bash


【解决方案1】:

使用切换变量翻转列表中的所有其他图像。

X=0

cat filenames | while read -r filename ; do
  if [ $X -eq 1 ] ; then
    # flip $filename
  fi
  # print $filename
  X=$((1-$X))
done

您可以将上面的cat filenames 替换为ls -1 *.jpg 以按字母顺序打印*.jpg 文件,或ls -1v to version-sort them,这种方式不需要将文件名中的序列号补零。

如果有数千个文件,则可以使用ls(无通配符)和grepfindsort 之一的组合来代替上述,以避免爆破ARG_MAX限制。

【讨论】:

    【解决方案2】:

    由于 bash 使用字符串比使用数字好得多,所以我的第一个想法是

    flip Foo\ *{0,2,4,6,8}.png
    

    flip 是您用来翻转图片的任何命令。

    这假定该命令可以接受多个文件名。如果没有,您可以使用循环:

    for f in Foo\ *{0,2,4,6,8}.png; do flip "$f"; done
    

    【讨论】:

      【解决方案3】:

      如果我理解得很好,你想翻转 1/2 png 图像吗?如果是,那么:

      convert -flip "Foo *{0,2,4,6,8,10}.png"
      

      或者如果你有太多文件:

      # making an array of files
      files=( *.png )
      
      # C style for loop (iterating 2 by 2)
      for ((i=0; i< ${#files[@]}; i+=2)) {
           # fliping the image
           convert -flip "${files[i]}"
      }
      

      convert 命令是众所周知的imagemagick 库的一部分。

      【讨论】:

        猜你喜欢
        • 2019-09-05
        • 2011-05-13
        • 2019-02-03
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-23
        相关资源
        最近更新 更多