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?
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
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')
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.