Конвертировать 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

Что я делаю неправильно?

Ответ 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')

вот и все.. ваше измененное и преобразованное изображение будет храниться в том же месте