1

尝试进行一些图像处理,加载图像以显示在 Graph 上,但没有显示任何内容。Win10 / Python 3.7.6 / PySimpleGUI 4.16.0 / Numpy 1.18.1

我通过 PIL.Image 加载图像,将其转换为 numpy 数组,然后转换为 base64,Graph 中的 DrawImage,但什么也不显示。我已经为此工作了好几次,一切正常。检查了几个小时,但没有任何帮助。有人可以帮我找出我错过或错误的地方吗?

我发现的东西,

  1. 我打开了,im.show() OK
  2. im.shape 是正确的,例如 (200, 150, 3) 用于 150(宽度)x 200(高度)x RGB 图像。
  3. im_np 显示不同的数据,看起来还可以。
  4. im_64 显示字节串
  5. draw 是 None,它应该是一个 id。
  6. 为 DrawingImage 设置了文件名选项,就可以了

我需要在这里使用 numpy 进行一些图像处理,因此需要进行转换。

import base64
import numpy as np
import PySimpleGUI as sg
from PIL import Image

filename = 'D:/Disk.png'
im = Image.open(filename)
width, height = im.size
im_np = np.array(im)    # It is necesary for future process
im_64 = base64.b64encode(im_np)

def Graph(key):
    return sg.Graph(im.size, graph_bottom_left=(0, 0),
                    graph_top_right=(width, height), key=key)

layout = [[Graph('GRAPH')]]
window = sg.Window('Graph', layout=layout, finalize=True)

draw = window.FindElement('GRAPH').DrawImage(
    data=im_64, location=(width/2, height/2))           # It failed
    # filename=filename, location=(width/2, height/2))  # It working well

while True:

    event, values = window.read()

    if event == None:
        break

window.close()
4

1 回答 1

2

您需要传递 PNG“作为二进制”编码的 base64,而不是编码为 base64 的 numpy 数组。

PySimpleGUI 文档中不是很清楚,但是当data作为 base64 传递时,数据不是作为 base64 的原始数据,而是作为 base64 的图像文件内容。

  • 将 PNG 文件读取为二进制文件:

    with open(filename, 'rb') as binary_file:
        #Read image file as binary data
        data = binary_file.read()
    
  • 将二进制表示编码为 base64:

    im_64 = base64.b64encode(data)
    
  • 传递im_64data

    draw = window.FindElement('GRAPH').DrawImage(
        data=im_64, location=(width/2, height/2))          # Works
    

这是一个代码示例:

import base64
import numpy as np
import PySimpleGUI as sg
from PIL import Image

#filename = 'D:/Disk.png'
filename = 'chelsea.png'

with open(filename, 'rb') as binary_file:
    #Read image file as binary data
    data = binary_file.read()

im = Image.open(filename)
width, height = im.size
im_np = np.array(im)    # It is necesary for future process
#im_64 = base64.b64encode(im_np)

# Encode the PNG binary representation 
im_64 = base64.b64encode(data)

def Graph(key):
    return sg.Graph(im.size, graph_bottom_left=(0, 0),
                    graph_top_right=(width, height), key=key)

layout = [[Graph('GRAPH')]]
window = sg.Window('Graph', layout=layout, finalize=True)

draw = window.FindElement('GRAPH').DrawImage(
    data=im_64, location=(width/2, height/2))          # Works
    #filename=filename, location=(width/2, height/2))  # It working well

while True:

    event, values = window.read()

    if event == None:
        break

window.close()

如果您想显示im_np,您可以使用以下帖子中的解决方案。

  • 将 PNG 图像写入im_np字符串:

    im_pil = Image.fromarray(im_np)
    
    with io.BytesIO() as output:
        im_pil.save(output, format="PNG")
        data = output.getvalue()
    
    im_64 = base64.b64encode(data)
    

结果:
在此处输入图像描述

于 2020-03-13T10:21:27.613 回答