Есть ли способ указать массив NumPy для «Image Widget»? - PullRequest
1 голос
/ 05 апреля 2019

Я ищу способ указать массив пустых изображений до source из Image виджета без сохранения в виде файла, такого как «.png» или «.jpg».Я знаю способ использования canvas (Texture.create(), blit_buffer(), Rectangle()) ..... Есть ли другой способ?

import kivy
from kivy.app import App
from kivy.uix.image import Image
from kivy.uix.widget import Widget
import cv2

class Test(Widget):

    img = cv2.imread('0.png', cv2.IMREAD_UNCHANGED)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img = cv2.flip(img, 0)

    # Is it possible to specify cv2(numpy) image to 'Image Widget' directly(without saving as file(jpg,png))?
    w_img = Image(source=img, size=(100, 100)) # >> error
    self.add_widget(w_img)

class DemoApp(App):
    def build(self):
        return Test()

if __name__ == '__main__':
    DemoApp().run()

1 Ответ

1 голос
/ 05 апреля 2019

Вы должны передать изображение через Текстуру :

import kivy
from kivy.app import App
from kivy.uix.image import Image
from kivy.uix.widget import Widget
from kivy.graphics.texture import Texture
import cv2

class Test(Widget):
    def __init__(self, **kwargs):
        super(Test, self).__init__(**kwargs)

        img = cv2.imread('0.png', cv2.IMREAD_UNCHANGED)
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        img = cv2.flip(img, 0)
        w, h, _ = img.shape
        texture = Texture.create(size=(w, h))
        texture.blit_buffer(img.flatten(), colorfmt='rgb', bufferfmt='ubyte')

        w_img = Image(size=(w, h), texture=texture)
        self.add_widget(w_img)

class DemoApp(App):
    def build(self):
        return Test()

if __name__ == '__main__':
    DemoApp().run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...