我正在尝试的事情是:
有一个图像服务器,将在端口5003上发送数据。
它传输的数据格式如下:
- 1个字节表示图像类型(0=raw,1=JPEG)
- 接下来的4个字节表示图像大小
- n个字节按以下顺序排列:
- 2个字节表示图像宽度
- 2个字节表示图像高度
- 1个字节表示B
- 1个字节表示R
- 1个字节表示G
我的目标是获取这些数据并使用以下代码将其转换为图像:
#! /usr/bin/python
import socket
import sys
import binascii
from PIL import Image
from StringIO import StringIO
# Connect to the server image
serverHost = 'localhost'
serverPort = 5003
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((serverHost, serverPort))
print >>sys.stderr, 'Connecting to host: ' + str(serverHost)
print >>sys.stderr, 'and server Port: ' + str(serverPort)
s.settimeout(1)
#Receive the image type
imageType = s.recv(1)
print>>sys.stderr, 'received %r' %binascii.hexlify(imageType)
print>>sys.stderr, 'Unpacked: ', int(binascii.hexlify(imageType), 16)
received = imageType.__len__()
print>> sys.stderr, "Received: ", received
#Receive the image size
imageSize = s.recv(4)
print>>sys.stderr, 'received %r' %binascii.hexlify(imageSize)
print>>sys.stderr, 'Unpacked: ', int(binascii.hexlify(imageSize), 16)
received = imageSize.__len__()
print>> sys.stderr, "Received: ", received
#Receive the image Data
imageData = ''
received =0
while(received < int(binascii.hexlify(imageSize), 16)):
buffer = s.recv(4096)
imageData += buffer
received += buffer.__len__()
print>> sys.stderr, "Received: ", received
img = Image.fromstring('RGB', (1280, 720), imageData, 'raw')
#img = Image.open(StringIO(binascii.hexlify(imageData)))
img = img.convert('RGB')
img.save('out.png')
#file = open('test.png', 'w');
#file.write(imageData)
#file.close()
#When we receive the image, we send the acknowledgement
s.send('OK')
s.close()`enter code here`
但每次我运行代码时,总是会出现这种错误。
"Value error not enough Image Data"
如果有变更
img = Image.fromstring('RGB', (1280, 720), imageData, 'raw')
to
img = Image.fromstring('BRG', (1280, 720), imageData, 'raw')
我遇到了这个错误:
Value error: Unrecognized mode,
有人知道如何解决这种问题吗?
struct
?除了这些,可能出错的另一个原因是服务器,但您没有提供相关信息。作为建议,您还需要发送图像模式,否则您如何知道原始jpg中的模式是'L'、'RGB'或其他模式呢? - mmgpstruct
模块+1)外,您可能需要多次调用s.recv()
,即s.recv(4)
可能会返回少于4个字节(您可以调用f = s.makefile('rb'); f.read(4)
确保读取了4个字节或者遇到了EOF。使用len(buff)
而不是buff.__len__()
- jfs