使用Tkinter和Python 3显示32位无符号整数图像

时间:2017-07-29 18:13:36

标签: python numpy opengl tkinter vtk

如果我有一个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。

1 个答案:

答案 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()