【问题标题】:Set a Kivy Image from a bytes variable从字节变量设置 Kivy 图像
【发布时间】:2020-09-13 21:46:09
【问题描述】:

由于我的 Kivy 应用程序中的预处理要求,我已经在我的运行代码中以字节变量形式保存了我的图像。从代码前面的文件或 url 读取的图像,所以我也知道每个图像变量的文件名和扩展名。

Kivy Image 类将文件作为输入并读取内容。要使用它,我必须将变量写入文件,然后再将它们读回。这是两个不必要的 I/O 和临时文件作为管理好吧。

有没有办法将图像从变量输入 Kivy?我看到 Kivy 有一个 CoreImage 类,但看不到如何将它变成一个小部件,并且不确定它是否能解决我的问题。

import kivy 
from kivy.uix.image import Image
import requests
...
#read image file into bytes variable
img_from_file = open(path, "rb").read()
...
#read image url into bytes variable
img_from_url = requests.get(url).content
...
#what I think the Kivy code should look like
#this doesn't work because a path is expected
kivy_image = Image(source=img_from_file)
root.add_widget(kivy_image)
kivy_image = Image(source=img_from_url)
root.add_widget(kivy_image)

【问题讨论】:

  • 可能有一些中间图像 api 层恰好有一个方便的功能,但你需要做的核心事情是将你的字节 blit 到一个纹理,然后显示它。
  • 我研究了将字节插入纹理并获得了相当的方法,然后遇到了我在 Github 上用 Kivy 提出的另一个问题 github.com/kivy/kivy/issues/7085
  • 如何播放视频而不是图片?

标签: python image kivy


【解决方案1】:

以下作品。您必须提供与字节变量中保存的图像一起使用的正确扩展名。

import io
from kivy.uix.image import Image
from kivy.core.image import Image as CoreImage

def get_kivy_image_from_bytes(image_bytes, file_extension):
    # Return a Kivy image set from a bytes variable
    buf = io.BytesIO(image_bytes)
    cim = CoreImage(buf, ext=file_extension)
    return Image(texture=cim.texture)

# Example
url = 'https://i.pinimg.com/564x/2a/3b/17/2a3b175c8b6752a62a6f6915ff472f8c.jpg'
bimage = requests.get(url).content
ext = 'jpg'
image = get_kivy_image_from_bytes(bimage, ext)
# image is a Kivy Image widget

【讨论】:

  • 如何播放视频而不是图片?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多