0

私の現在の問題では、特定のアニメーションを数回実行し、最後に別のアニメーションを実行する数百のアニメーション GIF があります。つまり、GIF は 3 回ほどループし、4 回目はループする代わりに別のアニメーションを実行します。これらのループはすべて、.gif ファイルのレイヤーにハードコードされているだけです。

私の目標は、最初のループを決定し、アニメーションを 10 フレームに縮小することです。私は、Pythonを使用して、最初のフレームが後のフレームと等しいときを見つけることができると考えています(それにより、最初の完全なシーケンスとフレーム数を見つけます)。これで、アニメーションにかかるフレーム数がわかりました。この数は、作業している数百の異なる画像間で変化します。したがって、1 つの画像の場合、最初のループは 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シェルから使用できるものであれば何でもかまいません。

4

3 に答える 3

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
>>> 
于 2012-10-16T21:57:09.330 に答える
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 までの番号が付けられます。

(はい、for i in $(seq 0 $k)代わりに言うこともできましたが、しませんでした。:)

于 2012-10-17T04:51:38.507 に答える
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
    }
  }
'
于 2012-10-17T08:07:16.880 に答える