所以这里是我想要做的事: 有这个图像服务器将在端口5003 发送数据就会传输数据的格式是如下的 1个字节图像类型(0 = raw,1 = JPEG) 然后接下来的4字节用于图像大小 然后将会有n字节,其顺序如下 2字节宽度,2字节高度,1字节用于B, 1个字节为R,对于G二进制数据的图像原始蟒蛇
1个字节所以我想要做的是获取数据,并将其与下面的代码转换成图像:
#! /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')
到
img = Image.fromstring('BRG', (1280, 720), imageData, 'raw')
我得到这个错误:
Value error: Unrecognized mode,
任何人都知道如何解决这类问题?
第二个错误是简单的因为PIL不支持“BRG”从字符串创建图像。第一个错误是由于您没有足够的图像数据来构建1280 * 720的图像。请检查len(imageData)== width * height * numchannels。另外,为什么不使用'struct'?除此之外,另一个可能的错误来源是服务器,而不是由您提供。作为一个建议,你还需要发送图像模式,否则你怎么知道你是否有'L','RGB'等等,作为原始jpg中的模式? – mmgp
除了@mmgp所说的(struct结构模块上的+1)之外,你可能需要多次调用s.recv(),也就是's.recv(4)'可能返回少于4个字节(你可以调用' f = s.makefile('rb'); f.read(4)'确保读取4个字节或遇到EOF,使用'len(buff)'而不是'buff .__ len __()' – jfs
您提到过“2个字节的宽度,2个字节的高度”,但我没有看到它被recv()编辑? –