2016-11-26 67 views
0

我想从服务器发送图像到客户端,然后让客户端用show()显示它,但我有一些问题。 这是发送图片的服务器代码:通过套接字发送图像并显示它

 im = ImageGrab.grab() 
     if not os.path.exists(r'C:\screens'): 
      os.makedirs(r'C:\screens') 
     im.save(r'C:\screens\screen.jpg') 
     data = open(r'C:\screens\screen.jpg', 'r') 
     data = data.read() 
     client_socket.send(str(data)) 

现在,很明显我无法通过套接字发送一个文件,所以我必须把它作为一个字符串,但后来,我不知道如何在客户端使用show(),因为你不能在一个字符串上使用show(),我不知道如何解决这个问题。 正如你可以看到我几乎是一个Python初学者,所以如果解决方案简单明了,我很抱歉。 我会感谢任何帮助,谢谢!

回答

1

你使用Python 2或3吗? (编辑:蟒蛇2.7,是在标签,对不起)无论如何:一个图像文件几乎总是不是文本,所以不要这样对待它。

  • 这也意味着你必须读取图像数据作为二进制的,而不是在文本模式下,所以用data = open("image.jpg", "rb").read()
  • 没有转换为str在插座发送之前,发送二进制(字节)直接代替。
  • 在接收端(您的客户端?)您recv来自套接字的字节。我想你可以使用Image.frombytes直接创建一个图像并显示它。或者,将从套接字获得的字节写入新文件(确保以“wb”二进制模式打开它)和Image.open()该文件。
+0

他有蟒蛇,2.7标签,所以他很可能使用Python 2 – tambre

+0

即时通讯使用Python 2.7,现在我把它canged为“RB”,它似乎更好地工作,但关于Image.frombytes - 它似乎它需要3个参数 - (模式,大小和解压的像素数据),我不知道我怎么能知道这三个。 (即使不知道最后一个是什么意思)。我怎么知道这些论点? – DesTeco

+0

好吧忘了''Image.frombytes''(它用于原始图像数据,这不是你要处理的内容),只需保存图像字节并使用Image.open来读取它。为了避免创建一个文件,你应该可以使用''io.BytesIO''来直接读取内存中的字节缓冲区。 –