python - 在 pyglet 或 PIL/python 中从远程服务器加载图像

标签 python user-interface python-imaging-library pyglet

我想将图像从远程计算机输入到 pyglet 中(尽管我对其他平台持开放态度,在这些平台上我可以呈现图像并记录用户的鼠标点击和击键)。目前,我正在尝试在远程服务器上使用 Flask 来完成此操作,并使用请求将其拉下来

import requests

from PIL import Image
import io
import pyglet
import numpy as np

r = requests.get('http://{}:5000/test/cat2.jpeg'.format(myip),)

这不起作用:

im = pyglet.image.load(io.StringIO(r.text))

# Error: 
File "/usr/local/lib/python3.4/dist-packages/pyglet/image/__init__.py", line 178, in load
    file = open(filename, 'rb')

TypeError: invalid file: <_io.StringIO object at 0x7f6eb572bd38>

这也不起作用:

im = Image.open(io.BytesIO(r.text.encode()))

# Error:
Traceback (most recent call last):

  File "<ipython-input-68-409ca9b8f6f6>", line 1, in <module>
    im = Image.open(io.BytesIO(r.text.encode()))

  File "/usr/local/lib/python3.4/dist-packages/PIL/Image.py", line 2274, in open
    % (filename if filename else fp))

OSError: cannot identify image file <_io.BytesIO object at 0x7f6eb5a8b6a8>

是否有另一种方法可以在不将文件保存到磁盘上的情况下实现此目的?

最佳答案

第一个示例无法正常工作,因为我遇到了编码问题。但这将使您开始使用手动 ImageData 对象来操作图像:

import pyglet, urllib.request

# == The Web part:
img_url = 'http://hvornum.se/linux.jpg'
web_response = urllib.request.urlopen(img_url)
img_data = web_response.read()

# == Loading the image part:
window = pyglet.window.Window(fullscreen=False, width=700, height=921)
image = pyglet.sprite.Sprite(pyglet.image.ImageData(700, 921, 'RGB', img_data))

# == Stuff to render the image:
@window.event
def on_draw():
    window.clear()
    image.draw()
    window.flip()

@window.event
def on_close():
    print("I'm closing now")

pyglet.app.run()

现在,更方便、更少手动的操作方法是使用 io.BytesIO 虚拟文件句柄并将其放入 pyglet.image.load() 中code> 和参数 file=dummyFile 如下所示:

import pyglet, urllib.request
from io import BytesIO

# == The Web part:
img_url = 'http://hvornum.se/linux.jpg'
web_response = urllib.request.urlopen(img_url)
img_data = web_response.read()
dummy_file = BytesIO(img_data)

# == Loading the image part:
window = pyglet.window.Window(fullscreen=False, width=700, height=921)
image = pyglet.sprite.Sprite(pyglet.image.load('noname.jpg', file=dummy_file))

# == Stuff to render the image:
@window.event
def on_draw():
    window.clear()
    image.draw()
    window.flip()

@window.event
def on_close():
    print("I'm closing now")

pyglet.app.run()

对我来说有效,而且速度也相当快。
最后一点,尝试将图像放入 pyglet.sprite.Sprite 对象中,它们往往更快,更容易使用,并为您提供了一大堆漂亮的功能(例如轻松定位, spr.scale 和旋转函数)

关于python - 在 pyglet 或 PIL/python 中从远程服务器加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44636251/

相关文章:

使用 subprocess 模块后 Python raw_input 不起作用

Python读取文件时使用什么内存资源

linux - 从内核的角度来看,linux 中的 GLI 和 CLI 有什么区别

Css 使用 jquery ui 并排放置列表

python 将图像保存在内存中而不保存到硬盘上?

python - 在 openCV 中使用单应性将 PNG 粘贴到图像上

python - 在 python 的 sort() 函数的情况下,多态性功能会失败,并且我们如何对 python 中的虚数进行排序?

java - CardLayout不切换卡片

python成像库保存函数

Python PIL 库 - 从 RGBA 数组保存图像