Что делать если библиотека pillow (python) при картинке которая имеет прозрачный фон, при вырисовке ставит черный фон?

Рейтинг: 1Ответов: 1Опубликовано: 18.02.2023

У меня есть код на pillow и код на quickchart на котором написана бубликовая диаграмма, при создании диаграммы фон прозрачный (я проверял через im1.show() ), считаю что проблема в самой библиотеке pillow которая создает фон картинке с прозрачным фоном

im = Image.open('prime.png')

qc = QuickChart()
qc.width = 500
qc.height = 300
qc.version = '2'
qc.background_color = ""
qc.config = {
  "type": 'doughnut',
  "data": {
    "datasets": [
      {
        "data": [43, 21],
        "backgroundColor": ['rgb(173 225 232)', 'rgb(33 170 184)'],
        "borderWidth": 0,
      },
    ],
  },
  "options": {
    "cutoutPercentage": 80,
    "legend": {
      "display": "false",
    },
    "plugins": {
      "datalabels": {
        "display": "false",
      },
    },
  },
}
url = qc.get_url()
raw = requests.get(url, stream=True).raw
im1 = Image.open(raw)
im1.save("diagramma.png")

diagramma = Image.open("diagramma.png")
Image.Image.paste(im, diagramma, (100, 400))

Ответы

▲ 1Принят

Решением будет вставка прозрачного изображения и его же как маску:

Image.Image.paste(im, diagramma, (100, 400), mask=diagramma)

Ниже я покажу другие варианты и почему они не помогут

input.jpg:

введите сюда описание изображения

Общий код:

# pip install requests
import requests

# pip install pillow
from PIL import Image

# pip install quickchart.io
from quickchart import QuickChart


qc = QuickChart()
qc.width = 500
qc.height = 300
qc.version = '2'
qc.background_color = ""
qc.config = {
    "type": 'doughnut',
    "data": {
        "datasets": [
            {
                "data": [43, 21],
                "backgroundColor": ['rgb(173 225 232)', 'rgb(33 170 184)'],
                "borderWidth": 0,
            },
        ],
    },
    "options": {
        "cutoutPercentage": 80,
        "legend": {
            "display": "false",
        },
        "plugins": {
            "datalabels": {
                "display": "false",
            },
        },
    },
}
url = qc.get_url()

raw = requests.get(url, stream=True).raw
diagramma = Image.open(raw)

Вариант input.jpg будет RGB, вставка в него RGBA:

...

img = Image.open('input.jpg')
Image.Image.paste(img, diagramma, (10, 10))

img.save('diagramma-full.png')

Результат:

введите сюда описание изображения


Вариант input.jpg будет RGB с конвертацией в RGBA, вставка в него RGBA:

...
img = Image.open('input.jpg')
img = img.convert('RGBA')

Image.Image.paste(img, diagramma, (10, 10))

img.save('diagramma-full.png')

Результат:

введите сюда описание изображения


Использование маски:

...

img = Image.open('input.jpg')
Image.Image.paste(img, diagramma, (10, 10), mask=diagramma)

img.save('diagramma-full.png')

Результат:

введите сюда описание изображения