在我目前的问题中,我有几百个动画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中可以使用的任何内容。
答案 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
这里有几个假设:
您始终需要第一帧和最后一帧。
帧数从0到n-1。
(是的,我原本可以说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
}
}
'