如何在 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
我的程序使用 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