将PIL图像对象从套接字客户端发送到套接字

2024-09-20 03:43:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把一个PIL-image对象从一个socket客户机发送到一个socket服务器。由于无法直接通过套接字发送图像对象,所以我使用numpy将其转换为数组,然后尝试将数组发送到套接字服务器。在

这是我的服务器程序(time的作用是每次保存文件时都为它取一个新名称):

import socket
import time
import os
import sys
import Image
import ImageGrab
import numpy

sd='C:\Users\Saurabh\Desktop'
s=socket.socket()
host=socket.gethostname()          #'WarMachine'
port=12300
s.bind((host,port))

s.listen(9)

while True:
    a,addr=s.accept()
    print "got connection from",addr
    a.send("1")
    imgarr=a.recvfrom(4096)
    img=Image.fromarray(numpy.uint8(imgarr))
    sec=time.time()
    lc=time.localtime(sec)
    t=time.asctime(lc)
    print t
    strng=""+t[8:10]+"_"+t[11:13]+"_"+t[14:16]+"_"+t[17:19]
    saveas=os.path.join(sd, 'ScreenShot_'+strng+'.jpg')
    img.save(saveas)
    print "run successful server"
    a.close()

上述客户端程序中的错误是:

^{pr2}$

客户程序如下:

import os
import sys
import time
import Image
import ImageGrab
import subprocess
import socket
import numpy

s=socket.socket()
host="WarMachine"     #use same hostname as server or else it wont work
port=12300
s.connect((host,port))

def shtDwn():
    time = 10
    subprocess.call(["shutdown.exe", "/s"])

def screenShot():
    sd='C:\Users\Saurabh\Desktop'

    img=ImageGrab.grab()
    imgarr=numpy.asarray(img)
    s.send(imgarr)
    print "run successful screentest1"


ip=s.recv(1024) 
#this receives 1 sent from server to activate snapshot function

if (ip=="1"):
    for i in range(0,10):
        screenShot()
        time.sleep(5)
elif(ip=="2"):
    shtDwn()
else:
    print"Wrong Input"

我在上面的客户端程序中得到的错误是:

run successful screentest1
Traceback (most recent call last):
  File "C:/Users/Saurabh/PycharmProjects/MajorProject/ScreenTest1.py", line 42, in <module>
    screenShot()
  File "C:/Users/Saurabh/PycharmProjects/MajorProject/ScreenTest1.py", line 27, in screenShot
    s.sendto(imgarr,("WarMachine",12300))
socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host

顺便说一下,我在使用下面的程序之前已经保存了图像,但是我不知道上面的程序有什么问题。在

上一个没有客户端和服务器的程序:

import os
import sys
import Image
import time
import ImageGrab
import numpy


sd='C:\Users\Saurabh\Desktop'

img=ImageGrab.grab()
imgarr=numpy.asarray(img)
print imgarr
img2=Image.fromarray(numpy.uint8(imgarr))
sec=time.time()
lc=time.localtime(sec)
t=time.asctime(lc)
print t
strng=""+t[8:10]+"_"+t[11:13]+"_"+t[14:16]+"_"+t[17:19]
saveas=os.path.join(sd, 'ScreenShot_'+strng+'.jpg')
#img.save(saveas)
img2.save(saveas)
print "run successful"

Tags: imageimportnumpyhostimgtimeossocket