在Kivy画布上显示PIL图像

2024-05-15 23:10:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我找不到任何关于如何在Kivy画布上显示PIL图像的文档。在

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

我需要使用枕头图像由于其他图像处理。我甚至尝试将图像加载到纹理中,然后将纹理应用到画布上,但是我无法确定如何将格式转换为兼容的格式。关于如何在纹理和画布上加载图像的Kivy文档几乎不存在。在


Tags: 文档图像imagesourcepilobject格式画布
2条回答
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

在下面的示例中,它演示了如何使用PIL-Image操作图像,并将其表示为Kivy图像小部件的source纹理canvas。在

示例

在主.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

<RootWidget>:
    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()

输出

Img01 - Kivy Image Source & TextureImg02 - Kivy Image canvas

相关问题 更多 >