Конвертировать PNG в JPEG с помощью подушки
Я пытаюсь конвертировать PNG в JPEG с помощью подушки. Я попробовал несколько записок без успеха. Эти 2, казалось, работали на маленьких изображениях PNG, как этот.
![enter image description here]()
Первый код:
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")
Второй код:
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)
Но если я попытаюсь преобразовать изображение большего размера, как это
![]()
я собираюсь
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
Что я делаю неправильно?
Ответы
Ответ 1
Вам следует использовать метод convert():
from PIL import Image
im = Image.open("Ba_b_do8mag_c6_big.png")
rgb_im = im.convert('RGB')
rgb_im.save('colors.jpg')
Дополнительная информация: http://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.convert
Ответ 2
Проблема с этим изображением не в том, что оно большое, а в том, что это не RGB, а именно, что это индексное изображение. ![enter image description here]()
Вот как я преобразовал его с помощью оболочки:
>>> 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)
Поэтому добавьте проверку режима изображения в вашем коде:
if not im.mode == 'RGB':
im = im.convert('RGB')
Ответ 3
Вы можете преобразовать открытое изображение как RGB, а затем сохранить его в любом формате. Код будет выглядеть следующим образом:
from PIL import Image
im = Image.open("image_path")
im.convert('RGB').save("image_name.jpg","JPEG") #this converts png image as jpeg
Если вы хотите, чтобы пользовательский размер изображения просто изменял размер изображения при открытии следующим образом:
im = Image.open("image_path").resize(x,y)
а затем конвертировать в RGB и сохранить его.
Проблема с вашим кодом заключается в том, что вы вставляете png в блок RGB и сохраняете его как jpeg жестким кодированием. вы фактически не конвертируете png в jpeg.
Ответ 4
если вы хотите конвертировать вместе с изменением размера, попробуйте это,
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')
вот и все.. ваше измененное и преобразованное изображение будет храниться в том же месте