ich versucht, ein gif auf einzelne Bilder mit Python Bildbibliothek zu konvertieren, aber es führt zu seltsamen RahmenPIL - Convert GIF Frames zu JPG
Der Input gif ist:
Source Image http://longcat.de/gif_example.gif
In Mein erster Versuch, ich habe versucht, das Bild mit Image.new zu einem RGB-Bild zu konvertieren, mit 255.255.255 als weißen Hintergrund - wie in jedem anderen Beispiel habe ich im Internet gefunden:
def processImage(infile):
try:
im = Image.open(infile)
except IOError:
print "Cant load", infile
sys.exit(1)
i = 0
try:
while 1:
background = Image.new("RGB", im.size, (255, 255, 255))
background.paste(im)
background.save('foo'+str(i)+'.jpg', 'JPEG', quality=80)
i += 1
im.seek(im.tell() + 1)
except EOFError:
pass # end of sequence
aber es führt zu seltsamen Ausgabedateien:
Example #1 http://longcat.de/gif_example1.jpg
Mein zweiter Versuch war, die gif in einem RGBA ersten zu konvertieren und dann seine Transparenzmaske verwenden, um die transparenten Stücke weiß zu machen:
def processImage(infile):
try:
im = Image.open(infile)
except IOError:
print "Cant load", infile
sys.exit(1)
i = 0
try:
while 1:
im2 = im.convert('RGBA')
im2.load()
background = Image.new("RGB", im2.size, (255, 255, 255))
background.paste(im2, mask = im2.split()[3])
background.save('foo'+str(i)+'.jpg', 'JPEG', quality=80)
i += 1
im.seek(im.tell() + 1)
except EOFError:
pass # end of sequence
, die in einer Ausgabe wie folgt ergibt:
Example #2 http://longcat.de/gif_example2.jpg
Der Vorteil gegenüber dem ersten Versuch war, dass der erste Rahmen sieht ziemlich gut Aber wie Sie sehen können, ist der Rest gebrochen
Was soll ich als nächstes versuchen?
Edit:
Ich glaube, ich auf die Lösung mit der
Example #3 http://longcat.de/gif_example3.png
ich die Palette des ersten Bildes für die anderen Bilder zu verwenden hatte, und verschmelzen sie ein gutes Stück näher gekommen vorheriger Frame (für gIF-Animationen, die diff-Bilder verwenden)
def processImage(infile):
try:
im = Image.open(infile)
except IOError:
print "Cant load", infile
sys.exit(1)
i = 0
size = im.size
lastframe = im.convert('RGBA')
mypalette = im.getpalette()
try:
while 1:
im2 = im.copy()
im2.putpalette(mypalette)
background = Image.new("RGB", size, (255,255,255))
background.paste(lastframe)
background.paste(im2)
background.save('foo'+str(i)+'.png', 'PNG', quality=80)
lastframe = background
i += 1
im.seek(im.tell() + 1)
except EOFError:
pass # end of sequence
Aber ich ac Dont tually wissen, warum meine Transparenz ist schwarz, statt weiß Auch wenn ich die Palette ändern (ändern Sie den Transparenzkanal weiß) oder die Transparenzmaske verwenden, ist der Hintergrund immer noch schwarz
Vielen Dank! Ich benutze Einfügen mit dem letzten Rahmen, weil einige Gifs Diffs für jeden Rahmen verwendet! – Schinken
Uhm, ersetzt die Palette wie das wird falsche Ergebnisse geben, wenn die Rahmen verschiedene Paletten haben. Ein Beispiel für das ist das Bild http://www.imagemagick.org/Usage/anim_opt/bunny_bgnd.gif (Ich denke, ich bin mir nicht sicher, ob ich die richtigen Links kopiere und einfüge). Das andere Problem, das ich sehe, könnte mit den Unterschieden zwischen PIL-Versionen zusammenhängen, aber ich bekomme nicht das gleiche Ergebnis wie Ihres (ich bekomme graue Bereiche in allen Frames außer dem ersten, wo es hätte transparent sein sollen). Das gleiche passiert für ein gif wie http://www.imagemagick.org/Usage/anim_opt/bunny_bgnd_opttrans.gif. – mmgp
@mmgp - hmm, yep Ich kann sehen, dass Frames mit verschiedenen Paletten ein Problem darstellen könnten. Ich stimme zu, dass das Abrufen anderer Ergebnisse ein Versionsfehler sein könnte. Leider habe ich im Moment keine Zeit, das zu betrachten, wenn Sie eine Lösung haben, bearbeiten Sie bitte meine Antwort oder fügen Sie Ihre eigene hinzu. Schön. – fraxel