在 python 中发送图像而不保存
Sending an image in python without saving it
我刚刚开始使用 PIL 和 Pygame,我想创建一个屏幕共享程序。
为了截取屏幕截图,我使用了 ImageGrab.grab() 现在我想将它发送到另一台计算机并在 Pygame 中打开它而不将其保存在任何计算机上。
这是我现在的服务器:
#region - - - - - - I M P O R T S - - - - - -
import socket
import select
from PIL import ImageGrab
import pickle
#endregion
#region - - - - - - C O N S T A N T S - - - - - -
PORT = 8253
CONCURRENT_USERS = 5
#endregion
#region - - - - - - M E T H O D S - - - - - -
def CaptureScreen():
img = ImageGrab.grab()
return img
#endregion
server_socket = socket.socket()
server_socket.bind(('', PORT))
server_socket.listen(CONCURRENT_USERS)
clients_list = []
while True:
read, write, error = select.select([server_socket] + clients_list, [], [], 0)
for i in read:
if i is server_socket:
client_socket, client_address = server_socket.accept()
clients_list.append(client_socket)
for i in clients_list:
img = CaptureScreen()
try:
i.send(pickle.dumps(img))
except socket.error:
clients_list.remove(i)
i.close()
我尝试使用 pickle 来发送图像,但响应出现错误。
因此,我正在寻找一种方法来通过套接字发送我使用 ImageGrab 捕获的图像,并在另一台计算机上使用 Pygame 打开它,而不将其保存在任何计算机上。
谁能帮我?我正在使用 Python 2.6 和 Windows 7。
提前致谢!
您可以使用 Image.tobytes()
获取原始图像的数据并使用 Image.frombytes()
从原始数据重建它,cf http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.tobytes and http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.fromstring
Pickle
是众所周知的不安全协议 FWIW,因此最好坚持使用原始数据。
请注意,这些是 Pillow fork of PIL. If you are using the original PIL library and cannot update to Pillow, you'll have to either use the Image.tostring()
and Image.fromstring()
methods, or use the save()
and load()
functions with a StringIO
as file object, as (roughly) documented here 版本 2.x 中的功能。正如 jsbueno 所提到的,最后一个解决方案可以节省相当多的带宽...
我刚刚开始使用 PIL 和 Pygame,我想创建一个屏幕共享程序。 为了截取屏幕截图,我使用了 ImageGrab.grab() 现在我想将它发送到另一台计算机并在 Pygame 中打开它而不将其保存在任何计算机上。 这是我现在的服务器:
#region - - - - - - I M P O R T S - - - - - -
import socket
import select
from PIL import ImageGrab
import pickle
#endregion
#region - - - - - - C O N S T A N T S - - - - - -
PORT = 8253
CONCURRENT_USERS = 5
#endregion
#region - - - - - - M E T H O D S - - - - - -
def CaptureScreen():
img = ImageGrab.grab()
return img
#endregion
server_socket = socket.socket()
server_socket.bind(('', PORT))
server_socket.listen(CONCURRENT_USERS)
clients_list = []
while True:
read, write, error = select.select([server_socket] + clients_list, [], [], 0)
for i in read:
if i is server_socket:
client_socket, client_address = server_socket.accept()
clients_list.append(client_socket)
for i in clients_list:
img = CaptureScreen()
try:
i.send(pickle.dumps(img))
except socket.error:
clients_list.remove(i)
i.close()
我尝试使用 pickle 来发送图像,但响应出现错误。 因此,我正在寻找一种方法来通过套接字发送我使用 ImageGrab 捕获的图像,并在另一台计算机上使用 Pygame 打开它,而不将其保存在任何计算机上。 谁能帮我?我正在使用 Python 2.6 和 Windows 7。 提前致谢!
您可以使用 Image.tobytes()
获取原始图像的数据并使用 Image.frombytes()
从原始数据重建它,cf http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.tobytes and http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.fromstring
Pickle
是众所周知的不安全协议 FWIW,因此最好坚持使用原始数据。
请注意,这些是 Pillow fork of PIL. If you are using the original PIL library and cannot update to Pillow, you'll have to either use the Image.tostring()
and Image.fromstring()
methods, or use the save()
and load()
functions with a StringIO
as file object, as (roughly) documented here 版本 2.x 中的功能。正如 jsbueno 所提到的,最后一个解决方案可以节省相当多的带宽...