Convertir png a jpeg usando Pillow

Estoy tratando de convertir png a jpeg usando almohada. He intentado varios scrips sin éxito. Estos 2 parecía funcionar en pequeñas imágenes png como éste.

Primer código:

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")

Segundo código:

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)

Pero si intento convertir una imagen más grande como esta

obtengo

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é estoy haciendo mal?

Solución

Debe utilizar el método convert():

from PIL import Image

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

más información: http://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.convert

Comentarios (3)

El problema con esa imagen no es que sea grande, es que no es RGB, concretamente que es una imagen índice.

Aquí'es cómo lo convertí usando el 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)

Así que añade una comprobación del modo de la imagen en tu código:

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

Puedes convertir la imagen abierta como RGB y luego puedes guardarla en cualquier formato. El código será:

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

Si desea personalizar el tamaño de la imagen sólo cambiar el tamaño de la imagen al abrir como este:

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

y luego convertir a RGB y guardarlo.

El problema con su código es que usted está pegando el png en un bloque RGB y guardarlo como jpeg por codificación dura. en realidad no está convirtiendo un png a jpeg.

Comentarios (2)