web-dev-qa-db-fra.com

Conversion de png en jpeg avec Pillow en python

J'essaie de convertir png en jpeg en utilisant un oreiller. J'ai essayé plusieurs scripts sans succès. Ces 2 semblaient fonctionner sur de 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'essaye de convertir une image plus grande comme celle-ci

je suis en train

Traceback (appel le plus récent en dernier):

 Fichier "png_converter.py", ligne 14, dans

 fichier "/usr/lib/python2.7/dist-packages/PIL/Image.py", ligne 1328, en copie

 self.im.paste (im, box, mask.im) ValueError: masque de transparence incorrect

Qu'est-ce que je fais mal?

26
alex

Vous devriez 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'infos: http://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.convert

49
dm2013

Le problème avec cette image n’est pas qu’elle est grande, c’est que ce n’est pas du RVB, c’est précisément une image d’index . enter image description here

Voici comment je l'ai converti à l'aide du 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')
6
Jeremy S.

Vous pouvez convertir l'image ouverte en RVB, puis 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 une taille personnalisée de l'image, redimensionnez-la simplement en l'ouvrant de la manière suivante:

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

puis convertir en RVB et enregistrez-le.

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

5
Mani

si vous voulez convertir avec 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')

thats it .. votre image redimensionnée et convertie sera stockée au même endroit

0
Mohideen ibn Mohammed