PIL Конвертировать PNG или GIF с прозрачностью в JPG без - PullRequest
16 голосов
/ 27 октября 2011

Я создаю прототип процессора изображений в Python 2.7, используя PIL1.1.7, и я хотел бы, чтобы все изображения заканчивались в JPG. Типы входных файлов будут включать TIFF, GIF, PNG с прозрачностью и без. Я пытался объединить два сценария, которые я нашел: 1. преобразовать другие типы файлов в JPG и 2. удалить прозрачность, создав чистое белое изображение и вставив исходное изображение на белый фон. Мои поиски спамятся людьми, которые стремятся создать или сохранить прозрачность, а не наоборот.

Я сейчас работаю с этим:

#!/usr/bin/python
import os, glob
import Image

images = glob.glob("*.png")+glob.glob("*.gif")

for infile in images:
    f, e = os.path.splitext(infile)
    outfile = f + ".jpg"
    if infile != outfile:
        #try:
        im = Image.open(infile)
        # Create a new image with a solid color
        background = Image.new('RGBA', im.size, (255, 255, 255))
        # Paste the image on top of the background
        background.paste(im, im)
        #I suspect that the problem is the line below
        im = background.convert('RGB').convert('P', palette=Image.ADAPTIVE)
        im.save(outfile)
        #except IOError:
           # print "cannot convert", infile

Оба сценария работают изолированно, но после их объединения я получаю ValueError: Bad Transparency Mask.

Traceback (most recent call last):
File "pilhello.py", line 17, in <module>
background.paste(im, im)
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1101, in paste
self.im.paste(im, box, mask.im)
ValueError: bad transparency mask

Я подозреваю, что если бы я сохранил PNG без прозрачности, я мог бы затем открыть этот новый файл, повторно сохранить его как JPG и удалить PNG, записанный на диск, но я надеюсь, что элегантное решение, которое я еще не нашел.

Ответы [ 3 ]

30 голосов
/ 27 октября 2011

Сделайте свой фон RGB, а не RGBA. И, конечно же, удалите последующее преобразование фона в RGB, поскольку он уже находится в этом режиме. Это сработало для меня с тестовым изображением, которое я создал:

from PIL import Image
im = Image.open(r"C:\jk.png")
bg = Image.new("RGB", im.size, (255,255,255))
bg.paste(im,im)
bg.save(r"C:\jk2.jpg")
7 голосов
/ 04 января 2012
image=Image.open('file.png')
non_transparent=Image.new('RGBA',image.size,(255,255,255,255))
non_transparent.paste(image,(0,0),image)

Ключ должен сделать маску (для вставки) самого изображения.

Это должно работать на тех изображениях, которые имеют "мягкие края" (где альфа-прозрачность установлена, чтобы не быть0 или 255)

4 голосов
/ 27 октября 2011

Следующее работает для меня на это изображение

f, e = os.path.splitext(infile)
print infile
outfile = f + ".jpg"
if infile != outfile:
    im = Image.open(infile)
    im.convert('RGB').save(outfile, 'JPEG')
...