【问题标题】:How to convert URI of image to image file in python如何在python中将图像的URI转换为图像文件
【发布时间】:2018-06-15 20:53:27
【问题描述】:

我的程序使用 pygal 制作了一个简单的图表,并将图表输出为 URI 字符串。我想将此 URI 转换为可以使用枕头操作的图像。我已经尝试解码字符串,但无法使其工作。我的代码的当前版本采用 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')

【问题讨论】:

    标签: python image uri pillow pygal


    【解决方案1】:

    我无法让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
    

    【讨论】:

    • 我曾尝试使用 cairosvg,但在下载它时无法让 Cairo 工作,因此在尝试导入 cairosvg 时一直出错
    • 如果我没记错的话,cairo 需要构建,不能仅使用pip install cairo 安装。它还需要安装一堆库。这就是为什么我有时更喜欢 Anaconda 的原因,因为这些软件包附带了所有依赖项,包括 lib... 文件,并将它们安装在环境中而不是整个系统中。如果你没用过 Anaconda,我建议你试试 Anaconda3。
    • 您是否考虑过更容易获得的选项,例如 matplotlibseabornpandas 而不是 pygal?我刚刚浏览了pygal API,看起来它更喜欢 SVG,这不是导出到 PIL 的最佳格式。
    • 我使用 matplotlib 并且能够让我的图表工作,感谢您的推荐。
    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多