PIL - Convertir les images GIF en JPG
J'ai essayé de convertir un gif pour les images avec Python Image de la Bibliothèque,
mais il en résulte bizarre cadres
L'Entrée gif est:
Source de l'Image http://longcat.de/gif_example.gif
Dans mon premier essai, j'ai essayé de convertir l'image avec l'Image.un
Image RVB, avec 255,255,255 comme fond blanc, comme dans toutes les autres
exemple que j'ai trouvé sur internet:
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
mais il en résulte bizarre fichiers de sortie:
Exemple #1 http://longcat.de/gif_example1.jpg
Mon deuxième essai a été, pour convertir le gif dans un RGBA abord, et ensuite utiliser
son masque de transparence, de rendre transparents les morceaux de blanc:
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
qui entraîne une sortie comme celle-ci:
Exemple #2 http://longcat.de/gif_example2.jpg
L'avantage sur le premier essai était, que la première image semble assez bon
Mais comme vous pouvez le voir, le reste est cassé
Que devrais-je essayer?
Edit:
Je crois que j'ai beaucoup plus proche de la solution
Exemple #3 http://longcat.de/gif_example3.png
J'ai dû utiliser la palette de la première image pour les autres images,
et de le fusionner avec l'image précédente (pour les animations gif qui utilisent
diff-images)
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
Mais en fait je ne sais pas, pourquoi mon transparence est noir au lieu de blanc
Même si je modifie la palette (modifier la transparence de canal à blanc)
ou utilisez le masque de transparence, le fond est toujours noir
source d'informationauteur Schinken
Vous devez vous connecter pour publier un commentaire.
Tout d'abord,
JPEG
ne supporte pas la transparence! Mais ce n'est pas le seul problème.. Que vous avez passer à l'image suivante de laGIF
lapalette
de l'information est perdue ( problème witn PIL? ) -PIL
est pas en mesure de convertir correctement à laRGBA
cadre (d'Où la première image est okish, mais tous les autres sont tordu). Ainsi, le travail de contournement consiste à ajouter lepalette
de retour pour chaque image, (qui est ce que vous faisiez dans votre dernier exemple de code, mais votre problème est que vous aviez sauvegardé commeRGB
pasRGBA
si vous n'aviez pas l'alpha/canal de transparence. Aussi, vous faisiez un peu de choses inutiles..). De toute façon, voici les .png avec la transparence et le code corrigé, espérons que c'est de quelque utilité 🙂Lors de la visualisation d'une image sur une visionneuse d'image, même lorsque la transparence est réglé à zéro, il a tendance à afficher l'image en noir. Une seule façon d'être sûr que votre image est vraiment transparent est de fusionner sur un autre. Le "émoticône" devraient être vus, tout en ne faisant pas obstacle à l'autre de l'image.Essayez:
Théoriquement, si vous ouvrez 'trial.jpg" dans la visionneuse d'image et le contenu de l'image initiale est préservée, et il se trouve foo image alors vous saurez à coup sûr si c'est juste de la visionneuse d'image et vos images sont belles...