如何在 python 中将图像的 URI 转换为图像文件

How to convert URI of image to image file in python

我的程序使用 pygal 制作了一个简单的图表,并将图表输出为 URI 字符串。我想将此 URI 转换为图像,然后我可以使用 pillow 对其进行操作。我试过解码字符串,但无法使其正常工作。我的代码的当前版本采用 URI 并将其转换为字节,因为我希望这样可以使转换更容易,如果我不需要这样做,我可以删除该行。

#Pygal graphing test

import pygal

import base64

from PIL import Image

#Get number of loops needed
user_num = int(input("How many people are taking the survey?"))
print()

#Give values to colour variables
red = 0
orange = 0
yellow = 0
green = 0
blue = 0
purple = 0


#Loop getting data from user
for x in range(1,user_num + 1):

    user_colour = input("What is your favourite colour?")
    print()

    if user_colour == "red":
        red = red + 1

    elif user_colour == "orange":
        orange = orange + 1

    elif user_colour == "yellow":
        yellow = yellow + 1

    elif user_colour == "green":
        green = green + 1

    elif user_colour == "blue":
        blue = blue + 1

    elif user_colour == "purple":
        purple = purple + 1

#Create bar graph object
bar_chart = pygal.Bar()

#Title of graph
bar_chart.title = "Favourite Colour"

#X-Axis label
bar_chart.x_labels = ("Red", "Orange", "Yellow", "Green", "Blue", "Purple")

#Add values
bar_chart.add('Favourite Colours', [red,orange,yellow,green,blue,purple])

#Save chart
data = bar_chart.render_data_uri()

#Convert string to bytes
b = bytes(data, 'utf-8')

我无法让 PIL.Image 读取数据,因为您正在生成的图像似乎是 SVG 图像,而 PIL 不支持它。你可以查看原因 here.

为了按照 here 所述将 SVG 转换为 PNG,我们可以使用 cairosvg:

import base64
import io
from PIL import Image
import pygal
from cairosvg import svg2png

# ... your code

# Save chart
data = bar_chart.render_data_uri()

# Remove the header placed by the URI
data = data.replace('data:image/svg+xml;charset=utf-8;base64,', '')

# Convert to bytes
data = data.encode()

# The data is encoded as base64, so we decode it.
data = base64.b64decode(data)

# Open a bytes file object
with io.BytesIO() as f:
    # write the svg data as a png to file object
    svg2png(bytestring=data, write_to=f)

    # read the file object with PIL and display
    img = Image.open(f)
    img.show()

更新

我建议使用 Anaconda 在环境中安装 cairosvg。这就是我创建环境和安装依赖项所做的。

$ conda create -n test python=3.5
$ source activate test
$ conda install --channel-priority -c conda-forge cairosvg
$ pip install pygal
$ python graph_testing.py  # run code