私はPythonでPILとTkinterを使ってチャットプログラム内の画像を自動的にアニメーション化しようとしています。時々彼らは働くが、ほとんどの場合、彼らはしない。PIL-アニメーションGIFですが、いくつかのフレームは黒です
基本的には、GIFシーケンスの各画像でImageTk.PhotoImage
を呼び出して画像をアニメートしています。アニメーションは、ラベルウィジェットをroot.after呼び出しで更新することによって実行されます。アニメーションはかなりスムーズに動作します
私の問題は、私が実行しようとしているほとんどのアニメーションGIFが壊れている、または何かです。通常、最初のフレームは問題ありませんが、残りの部分は完全に黒色かアーティファクトでいっぱいです。
これらはイメージです。
この1つはそれが動作するいくつかのいずれかです。 http://fc02.deviantart.net/fs42/f/2009/061/d/8/d856ba6223c66ce347c6c814f67d307b.gif
これらのものは黒の点滅:
http://fc02.deviantart.net/fs70/f/2010/007/c/3/_mekolai__by_Pyritie.gif
http://e.deviantart.com/emoticons/s/shakefist.gif
編集:私はノー見ます私を助けたいと思っています。多分それはtlだからです; dr。私はそれ
にいくつかのコードを短くしてみましょう:
def ExtHandler(self, widget, url): # sorts out what to do with each file extensions
name = url.split('/')[-1].split('?')[0]
path = './Storage/Temp/Images/'+name
try:
if name.endswith('.gif'):
img = Image.open(path)
animation = []
x = 0
print name
while True:
try:
img.seek(x)
newpath = './Storage/Temp/Images/{0}__{1}.png'.format(x, name.split('.', 1)[0])
img.save(newpath, transparency = img.info['transparency'], format='PNG')
newimg = Image.open(path)
newimg.load()
newimg = newimg.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=255)
dur = img.info['duration']
if dur < 50: dur = 50
newimg = Image.open(newpath)
animation.append((PhotoImage2(newimg), dur))
x += 1
except EOFError:
break #no more images in the animation!
except Exception as e:
print traceback.format_exc()
break
if len(animation) > 1:
self.animations[name] = animation
elif name.endswith('.jpg'):
img = Image.open(path)
img = img.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=255)
elif name.endswith('.png'):
img = Image.open(path)
img.load()
try:
alpha = img.split()[3]
img = img.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=255)
mask = Image.eval(alpha, lambda a: 255 if a <=128 else 0)
img.paste(255, mask)
except:
img = img.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=255)
height, width = img.size[0], img.size[1]
if width > 100 or height > 100:
img = maxSize(img, (100, 100), Image.ANTIALIAS) # resize thumbnails
self.images[name] = PhotoImage2(img)
if name in self.animations:
self.animation(name)
else:
self.update_frames(name, self.images[name])
except:
print name
traceback.print_exc()
def animation(self, name):
if name not in self.animations:
return
x = self.animations[name].pop(0)
self.animations[name].append(x)
img, time = x
self.images[name] = img
self.update_frames(name, self.images[name])
self.root.after(time, lambda: self.animation(name))
私はPythonでPILとTkinterを使用しています。申し訳ありませんが、私は私がその情報を削除した私の質問を再編集したことを認識しませんでした – Blazer