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

Display a 32 bit unsigned int image with Tkinter and Python 3

如果我有一个 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 window 或框架中,我可以访问 VTK8。

第 1 步:制作一个可以进行像素转换的函数:

def convert(pixel):
    '''convert 32-bit integer to 4 8-bit integers'''
    return list(int(pixel).to_bytes(4, 'big'))

第 2 步:将 2D 数组转换为 3D 数组(我假设您将数组命名为 "data")。

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 将其加载到标签小部件中:

from PIL import ImageTk
import tkinter as tk

lbl = tk.Label()
lbl.pimg = ImageTk.PhotoImage(img)
lbl.config(image=lbl.pimg)
lbl.pack()