【发布时间】:2015-01-25 00:39:36
【问题描述】:
首先,我对kivy完全陌生,所以我有点挣扎。
我正在尝试在 kivy 窗口中显示一个 numpy 数组。 到目前为止,我发现这应该可以使用 Texture Class (http://kivy.org/docs/api-kivy.graphics.texture.html)。
随着我的 numpy 数组不时更改,我正在尝试将以下代码调整为我的应用程序。
# create a 64x64 texture, defaults to rgb / ubyte
texture = Texture.create(size=(64, 64))
# create 64x64 rgb tab, and fill with values from 0 to 255
# we'll have a gradient from black to white
size = 64 * 64 * 3
buf = [int(x * 255 / size) for x in range(size)]
# then, convert the array to a ubyte string
buf = b''.join(map(chr, buf))
# then blit the buffer
texture.blit_buffer(buf, colorfmt='rgb', bufferfmt='ubyte')
# that's all ! you can use it in your graphics now :)
# if self is a widget, you can do this
with self.canvas:
Rectangle(texture=texture, pos=self.pos, size=(64, 64))
似乎创建纹理并对其进行更改可以正常工作,但我不明白如何显示纹理。
谁能给我解释一下,如何使用
with self.canvas:
Rectangle(texture=texture, pos=self.pos, size=(64, 64))
在某种程度上,我可以看到我的图片/numpy 数组。
提前非常感谢! Holzroller
编辑: 我发现使用 Kivy 1.8.0 和纹理类有点乱。所以我通过 github 升级到 Kivy 1.9.0(在 Ubuntu 14.04 LTS 中通过 apt-get 安装 Kivy 为您提供 1.8.0 版本),我可以使用以下代码查看纹理。希望对和我有同样问题的人有所帮助。
from kivy.graphics.texture import Texture
from kivy.graphics import Rectangle
from kivy.uix.widget import Widget
from kivy.base import runTouchApp
from array import array
from kivy.core.window import Window
# create a 64x64 texture, defaults to rgb / ubyte
texture = Texture.create(size=(1280, 1024), colorfmt='rgb')
# create 64x64 rgb tab, and fill with values from 0 to 255
# we'll have a gradient from black to white
size = 1280 * 1024 * 3
buf = [int(x * 255 / size) for x in range(size)]
# then, convert the array to a ubyte string
arr = array('B', buf)
# buf = b''.join(map(chr, buf))
# then blit the buffer
texture.blit_buffer(arr, colorfmt='rgb', bufferfmt='ubyte')
# that's all ! you can use it in your graphics now :)
# if self is a widget, you can do this
root = Widget()
with root.canvas:
Rectangle(texture=texture, pos=(0, 0), size=(1280*3, 1024*3))
runTouchApp(root)
编辑2: 基本上我回到了原来的问题: 我有一个 numpy 数组(类型 'numpy.ndarray'; dtype 'uint8'),我正在尝试将其转换为格式,以便纹理向我显示图像。我试图将其分解为与我在上面发布的示例代码中相同的方式。但我很遗憾没有工作。我真的不知道我在这里做错了什么。 (我的 numpy 数组在以下代码中称为 im2)
list1 = numpy.array(im2).reshape(-1,).tolist()
arr = array('B', list1)
texture.blit_buffer(arr, colorfmt='rgb', bufferfmt='ubyte')
【问题讨论】:
标签: arrays numpy textures kivy