Невозможно преобразовать изображение из PNG в JPG с помощью PIL (библиотека изображений Python)

Я использую библиотеку weasyprint в python для преобразования HTML-шаблона в png. Затем я пытаюсь преобразовать изображение png в jpg, используя библиотеку Python с именем PIL (PILLOW).

ИЗОБРАЖЕНИЕ в формате PNG приведено ниже. введите здесь описание изображения

Но изображение, полученное после преобразования с помощью PIL, — это не то, что я ожидал. Цвета теряются и видны только некоторые компоненты изображения.

        from PIL import Image
        img = Image.open(file_path)
        rgb_im = img.convert('RGB')

        jpg_img_path = os.path.splitext(file_path)[0]
        jpg_img_path += '.jpg'
        rgb_im.save(jpg_img_path)

Когда я попытался использовать онлайн-редактор, они предоставили мне идеальное изображение из png. Ниже показано изображение в формате jpg, полученное с помощью онлайн-конвертера. введите здесь описание изображения

И изображение, когда я использовал PIL. введите здесь описание изображения


person Amanpreet    schedule 27.02.2019    source источник
comment
Пожалуйста, поделитесь изображением PNG, которое вы открыли с помощью PIL.   -  person Mark Setchell    schedule 27.02.2019


Ответы (4)


Это может быть совершенно неправильно, но я подозреваю, что происходит то, что ваш HTML-рендеринг дает вам альфа-канал PNG с прозрачным фоном, который затем сглаживается до черного с помощью .convert(). Если я прав, проблема должна исчезнуть, если вы создадите полностью белое изображение (или любой другой фон, который вы предпочитаете) того же размера, что и ваш PNG, и скомпонуете PNG поверх него перед convert() и сохранить (). (Возможно, есть более разумный способ сделать это, который не требует от вас фактического создания полного фонового изображения, но это должно подойти в качестве теста).

person Ture Pålsson    schedule 27.02.2019

Ответ @Ture Palsson правильный, это альфа-проблема. Вы можете попытаться избавиться от него, используя обходной путь PIL, как показано здесь , или вы используете какой-нибудь очень простой код skimage, который я бы предпочел:

from skimage.io import imread, imsave
from skimage.color import rgba2rgb
png = imread('UCLgy.png')
imsave('UCLgy.jpg', rgba2rgb(png, (1,1,1))) # 1, 1, 1 is white
person anki    schedule 27.02.2019

Проблема в том, что исходное изображение PNG имеет альфа-слой, то есть прозрачность, которую JPEG не поддерживает. Проще всего сделать новое изображение того же размера, что и исходное изображение, но залитое белым цветом, а затем вставить прозрачное изображение сверху:

#!/usr/bin/env python3

from PIL import Image

# Open image
im = Image.open('image.png')

# Make a background, same size filled with solid white
result = Image.new('RGB', (im.width,im.height), color=(255,255,255))

# Paste original image over white background and save
result.paste(im,im)
result.save('result.jpg')

Таким образом, вы просто используете те же модули, которые у вас уже есть, без введения каких-либо новых зависимостей.

person Mark Setchell    schedule 27.02.2019

Вы можете использовать библиотеку python imgkit для преобразования HTML непосредственно в png

person Simdi    schedule 27.02.2019