Mostrar imagen PIL en Kivy Canvas

No puedo encontrar ninguna documentación sobre cómo mostrar una imagen PIL en un canvas Kivy.

Rectangle(source=image) give TypeError: 'Image' object has no attribute '__getitem__' 

Necesito usar una imagen de almohada debido a otras manipulaciones de imagen. Incluso intenté cargar la imagen en una textura y luego aplicar la textura al canvas, pero luego no puedo averiguar cómo convertir los formatos en algo compatible. La documentación de Kivy sobre cómo cargar imágenes en texturas y canvass es prácticamente inexistente.

 from kivy.core.image import Image as CoreImage from kivy.uix.image import Image as kiImage from PIL import Image, ImageDraw, ImageFont from io import BytesIO canvas_img = Image.new('RGB', (240, 120), color=(255, 255, 255)) (do stuff to canvas_img) data = BytesIO() canvas_img.save(data, format='png') data.seek(0) # yes you actually need this im = CoreImage(BytesIO(data.read()), ext='png') self.beeld = kiImage() # only use this line in first code instance self.beeld.texture = im.texture 

En el siguiente ejemplo, se demuestra el uso de PIL Image para manipular las imágenes y presentarlas como fuente , textura y canvas de los widgets de Kivy Image.

Ejemplo

main.py

 from kivy.app import App from kivy.uix.tabbedpanel import TabbedPanel from kivy.uix.image import CoreImage from kivy.lang import Builder from PIL import Image kv = Builder.load_string(''' #:kivy 1.11.0 : img: img img3: img3 img4: img4 do_default_tab: False TabbedPanelItem: text: 'PIL Image' Screen: RelativeLayout: Image: id: img pos_hint: {"left": 1, 'bottom': 1} size_hint: 0.5, 1 allow_stretch: True RelativeLayout: Image: id: img3 pos_hint: {"right": 1, 'bottom': 1} size_hint: 0.5, 1 allow_stretch: True TabbedPanelItem: text: 'canvas' Screen: FloatLayout: Image: id: img4 keep_data: True allow_stretch: True canvas.before: Color: rgba: 0, 0, 0, 1 # Black Rectangle: pos: self.pos size: self.size ''') class RootWidget(TabbedPanel): def __init__(self, **kwargs): super(RootWidget, self).__init__(**kwargs) iw = Image.open("./DSC08518.JPG") # Use PIL.Image iw.save('./phase.jpg') gray = iw.convert('1') gray.save('./gray_im.jpg') self.img.source = './phase.jpg' self.img3.texture = CoreImage('./gray_im.jpg').texture self.img4.source = './gray_im.jpg' class KivyPILApp(App): title = "Kivy & PIL Demo" def build(self): return RootWidget() if __name__ == "__main__": KivyPILApp().run() 

Salida

Img01 - Fuente de imagen Kivy y textura Img02 - Lienzo Kivy Image