python - tutorial - the django project
Enviar una imagen en python sin guardarla (1)
Empecé a trabajar con PIL y Pygame y quería crear un programa de pantalla compartida. Para tomar una captura de pantalla utilicé ImageGrab.grab () y ahora quiero enviarlo a otra computadora y abrirlo en Pygame sin guardarlo en ninguna de las computadoras. Este es mi servidor ahora mismo:
#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()
Intenté usar Pickle para enviar las imágenes pero recibí un error en respuesta. Así que estoy buscando una forma de enviar una imagen que he capturado usando ImageGrab a través de sockets y abrirla con Pygame en otra computadora sin guardarla en ninguna de las computadoras. ¿Alguien puede ayudarme? Estoy usando Python 2.6 y Windows 7. ¡Gracias de antemano!
Puede obtener los datos de la imagen sin Image.tobytes()
con Image.tobytes()
y reconstruirlos a partir de datos sin Image.frombytes()
con Image.frombytes()
, cf http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image .Image.tobytes y http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.fromstring
Pickle
es un protocolo FWIW notoriamente inseguro, por lo que es mejor quedarse con los datos sin procesar.
Tenga en cuenta que estas son características de la versión 2.x de la horquilla Pillow de PIL. Si está utilizando la biblioteca PIL original y no puede actualizar a Pillow, deberá usar los Image.tostring()
e Image.fromstring()
, o usar las funciones save()
y load()
con un StringIO
como objeto de archivo, como (aproximadamente) documentado aquí . Como mencionó jsbueno, esta última solución podría ahorrar bastante ancho de banda ...