如果我有一个32位整数的2D numpy数组,其中每个都指的是像素RGBA值(每个8位),在C ++中生成如此
const Colour *colours = getColourArray();
Uint32 *pixels = getPixelBuffer();
for(size_t i = 0; i < WIDTH * HEIGHT; i++) {
pixels[i] = (Uint32)(colour[i].r() << 24 | colour[i].g() << 16 | colour[i].b() << 8 | 255);
}
在SDL中,我们可以使用上面的pixels
缓冲区更新纹理(其中Color只是一个简单的RGB结构)。
如何用Tkinter和Python3显示这样的纹理?
编辑:如果可以将VTK渲染器嵌入到Tkinter窗口或框架中,我可以访问VTK8。
答案 0 :(得分:0)
第1步:制作一个可以进行像素转换的功能:
def convert(pixel):
'''convert 32-bit integer to 4 8-bit integers'''
return list(int(pixel).to_bytes(4, 'big'))
第2步:将2D数组转换为3D数组(我假设您将数组命名为#34;数据&#34;)。
import numpy as np
new = np.empty((data.size, 4))
old_shape = data.shape
data.shape = -1, # reshape into a 1D array
for i in range(data.size):
new[i] = convert(data[i])
new.shape = old_shape + (-1,) # reshape into 3D
步骤3:将numpy数组加载到图像中。
from PIL import Image
img = Image.fromarray(new, mode='RGBA')
步骤4a:如果您要做的只是查看或保存图像,那么您可以使用PIL来做到这一点;不需要tkinter。
img.show() # display in your default image viewer
img.save('data.png') # save to disk
步骤4b:如果您确实需要将其加载到tkinter,那么您可以使用ImageTk.PhotoImage
将其加载到Label小部件中:
from PIL import ImageTk
import tkinter as tk
lbl = tk.Label()
lbl.pimg = ImageTk.PhotoImage(img)
lbl.config(image=lbl.pimg)
lbl.pack()