Невозможно преобразовать изображение из PNG в JPG, используя PIL (библиотека изображений Python) - PullRequest
0 голосов
/ 27 февраля 2019

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

Изображение PNG приведено ниже.enter image description here

Но изображение, полученное после преобразования с использованием 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, полученное из онлайн-конвертера .enter image description here

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

Ответы [ 4 ]

0 голосов
/ 27 февраля 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')

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

0 голосов
/ 27 февраля 2019

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

0 голосов
/ 27 февраля 2019

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

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
0 голосов
/ 27 февраля 2019

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

...