bash均匀选择10个数字

时间:2012-10-16 21:33:35

标签: python image bash animated-gif

在我目前的问题中,我有几百个动画GIF,它会预先形成一定的动画几次,然后最后一次做不同的动画。所以这意味着gif循环3次左右然后在第4次循环而不是循环它会做一个不同的动画。这些循环都只是硬编码到.gif文件中的图层中。

我的目标是确定第一个循环并将动画缩小为十个帧。我认为使用python,我可以找到第一帧等于后一帧(从而找到第一个完整序列和帧数)。现在,我有动画所采用的帧数,并且这个数字在我使用的数百个不同图像中是可变的。因此,对于一个图像,第一个循环将在20个左右的帧中完成,另一个可能在25个帧中。一些将需要75个左右的帧(因为它们是非常慢的图像)

我的问题是使用这些数字(20,25,75,......或者第一个循环是什么)我怎么能最好把它变成只有10个。在我脑海里我做了一点数学,这些都很好我需要弄清楚如何生成

的例子
20 -> 20/10 = 2 Resulting sequence: [0, 20) step 2
25 -> 25/10 = 2.5 Sequenece: [0, 25).... Step ?? should alternate between 2 and 3 somehow
75 -> 75/10 = 7.5 Sequenece: [0, 75).... Step ?? should alternate between 7 and 8 somehow

我的解决方案可以是bash脚本或python,也可以是bash shell中可以使用的任何内容。

3 个答案:

答案 0 :(得分:2)

注意:

下面的更短解决方案

这是一个Python迭代器类,可用于生成这些序列:

class quantizer:
    def __init__(self, total, limit):
        self.total = total
        self.limit = limit
        self.index = float(0)
        self.step = float(total) / float(limit)
    def __iter__(self):
        return self
    def next(self):
        if self.index >= self.total:
            raise StopIteration
        result = int(round(self.index))
        self.index += self.step
        return result

更好的解决方案: 有人向我指出,使用生成器有一个更简洁的解决方案:

def quantize(total, limit):
    i, step = 0.0, float(total) / float(limit)
    while i < total:
        yield int(round(i))
        i += step

你可以像这样使用它:

>>> for frame in quantize(25, 10):
...     print frame
... 

0
3
5
8
10
13
15
18
20
23
>>> 

答案 1 :(得分:1)

# shrink N K -- outputs K (default 10) evenly-spaced integers in the range [0, N)
shrink() {
  local i k=$((${2:-10} - 1)) n=$(($1 - 1))
  for i in 0 $(seq $k); do echo $((n * i / k)); done
}

$ echo $(shrink 75)
0 8 16 24 32 41 49 57 65 74
$ echo $(shrink 20)
0 2 4 6 8 10 12 14 16 19

这里有几个假设:

  1. 您始终需要第一帧和最后一帧。

  2. 帧数从0到n-1。

  3. (是的,我原本可以说for i in $(seq 0 $k)。但我没有。:)

答案 2 :(得分:1)

awk解决方案。如果您不想从第0帧开始,可以轻松添加偏移量。

#!/bin/bash
awk -v ori_f=$1 -v final_f=$2 '
  BEGIN {
    steps=ori_f/final_f
    for (i=0; i<final_f; i++){
      printf "%.0f\n", val
      val=val+steps
    }
  }
'