所以這裏是我想要做的事: 有這個圖像服務器將在端口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()編輯? –