Zuvor beim Schreiben von Artikeln, die von GIF-Animationen abhängig sind Details zum GIF-Format. Ich habe einen großartigen Artikel namens htm # ImageBlock gefunden. Jedes Bild in der GIF-Datei hat eine Verzögerungszeit von 2 Bytes, die in Schritten von 0,01 Sekunden festgelegt zu sein scheint.
Es ist natürlich, dass die GIF-Datei Bilddaten enthält, aber es scheint, dass sich vor den Bilddaten ein 8-Byte-Block namens ** Graphic Control Extension ** befindet. Graphic Control Extension --Erweiterungseinführer (1B) = 0x21 <= Markierung 1
Ich habe die GIF-Animation mit einer Verzögerungszeit von 1 Sekunde mit einem Binäreditor überprüft.
Es gibt eine Verzögerungszeit "0x6400", die den Markierungen 1-3 "0x21f904" ordnungsgemäß folgt. Da es in ** 1 Sekunde ** eingestellt ist, ist es ** 100 **, wenn es durch ** 0,01 ** geteilt wird, also "100 = 0x0064", und wenn es in Little Dian gespeichert wird, ist es definitiv "0x6400". Sie können die Anzeigezeit für jedes Bild ** ändern, indem Sie diesen Wert ändern.
ChangeDelay.py
#Öffnen Sie die GIF-Datei als Binärdaten.
FileName = 'test.gif'
with open(FileName,'rb') as f:
Bin = f.read()
#Suchen Sie nach Graphic Control Extention und notieren Sie die Position und den Verzögerungswert in List.
GCE = b'\x21\xf9\x04'
DelayList = []
point = 0
while point < len(Bin):
start = Bin.find(GCE,point)
if start<0:break
delay = int.from_bytes(Bin[start+4:start+6],byteorder="little")
DelayList.append([start+4,delay])
point = start+1
#Ändern Sie die erste auf 1 Sekunde und die zweite Hälfte auf das Fünffache der Länge.
DelayList[0][1]=100
for i in range(1,len(DelayList)//2):
DelayList[-i][1]*=5
#Schreiben Sie Binärdaten neu.
for point,delay in DelayList:
Bin = Bin[:point] + delay.to_bytes(2,byteorder="little") + Bin[point+2:]
#Speichern Sie Binärdaten als GIF.
with open('temp.gif','wb') as f:
f.write(Bin)
Before Alle 20 Bilder sind auf 0,05 Sekunden eingestellt.
After Die erste wurde auf 1 Sekunde eingestellt und die zweite Hälfte wurde fünfmal umgeschrieben.
Recommended Posts