97 votes

Convertir png en jpeg avec Pillow

J'essaie de convertir des png en jpeg en utilisant pillow. J'ai essayé plusieurs scripts sans succès. Ces 2 semblent fonctionner sur des petites images png comme celle-ci.

enter image description here

Premier code :

from PIL import Image
import os, sys

im = Image.open("Ba_b_do8mag_c6_big.png")
bg = Image.new("RGB", im.size, (255,255,255))
bg.paste(im,im)
bg.save("colors.jpg")

Deuxième code :

image = Image.open('Ba_b_do8mag_c6_big.png')
bg = Image.new('RGBA',image.size,(255,255,255))
bg.paste(image,(0,0),image)
bg.save("test.jpg", quality=95)

Mais si j'essaie de convertir une image plus grande comme celle-ci

Je reçois

Traceback (most recent call last):
  File "png_converter.py", line 14, in <module>
    bg.paste(image,(0,0),image)
  File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1328, in paste
    self.im.paste(im, box, mask.im) ValueError: bad transparency mask

Qu'est-ce que je fais mal ?

0 votes

Avez-vous essayé este ?

0 votes

Oui, je l'ai fait, c'est le premier exemple.

171voto

dm2013 Points 676

Vous devez utiliser la méthode convert() :

from PIL import Image

im = Image.open("Ba_b_do8mag_c6_big.png")
rgb_im = im.convert('RGB')
rgb_im.save('colors.jpg')

Plus d'informations : http://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.convert

1 votes

Mais il rend le fond blanc de l'image blanc. Y a-t-il un moyen de le réparer ?

13 votes

@lifeisshubh le blanc est censé être converti en noir ? !

4 votes

J'ai tellement ri en voyant ça. @lifeisshubh Voulez-vous dire "ça rend le fond blanc de l'image noir ?"

26voto

Jeremy S. Points 544

Le problème avec cette image n'est pas qu'elle est grande, c'est qu'elle n'est pas RVB, plus précisément qu'il s'agit d'une image d'index. enter image description here

Voici comment je l'ai converti en utilisant le shell :

>>> from PIL import Image
>>> im = Image.open("Ba_b_do8mag_c6_big.png")
>>> im.mode
'P'
>>> im = im.convert('RGB')
>>> im.mode
'RGB'
>>> im.save('im_as_jpg.jpg', quality=95)

Ajoutez donc une vérification du mode de l'image dans votre code :

if not im.mode == 'RGB':
  im = im.convert('RGB')

24voto

Mani Points 2402

Vous pouvez convertir l'image ouverte en RGB et ensuite vous pouvez l'enregistrer dans n'importe quel format. Le code sera :

from PIL import Image
im = Image.open("image_path")
im.convert('RGB').save("image_name.jpg","JPEG") #this converts png image as jpeg

Si vous voulez personnaliser la taille de l'image, il suffit de la redimensionner à l'ouverture comme ceci :

im = Image.open("image_path").resize(x,y)

puis convertissez-le en RVB et enregistrez-le.

Le problème avec votre code est que vous collez le png dans un bloc RGB et que vous l'enregistrez en tant que jpeg par codage dur. Vous ne convertissez pas réellement un png en jpeg.

0 votes

Toutes les réponses sont bonnes, merci, mais avez-vous une idée de la façon dont vous pouvez également compresser la taille ?

0 votes

Essayez d'optimiser=True lors de l'enregistrement de l'image.

3voto

Si vous voulez convertir en même temps que redimensionner, essayez ceci,

from PIL import Image

img = i.open('3-D Tic-Tac-Toe (USA).png').resize((400,400)) # (x,y) pixels
img.convert("RGB").save('myimg.jpg')

C'est tout. Votre image redimensionnée et convertie sera stockée au même endroit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X