【发布时间】:2012-11-30 21:37:09
【问题描述】:
所以这就是我想要做的: 有这个图像服务器将在端口 5003 上发送数据 它将传输的数据格式如下 图像类型为 1 个字节(0=原始,1=JPEG) 然后是图像大小的下一个 4 字节 然后之后将有n个字节,顺序如下 宽度 2 字节,高度 2 字节,B 1 字节,R 1 字节,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 所说的(
struct模块上的+1),您可能需要多次调用 s.recv() 即,s.recv(4)可能返回少于 4 个字节(您可以调用f = s.makefile('rb'); f.read(4)以确保读取 4 个字节或遇到 EOF。使用len(buff)而不是buff.__len__() -
您提到“宽度为 2 个字节,高度为 2 个字节”,但我不认为它是 recv()ed?
-
mmgp:是的,在我将图像从 1280x720 调整为 320x240 后,错误不再存在。其实这是我第一次使用 Python,所以你能解释一下如何使用 struct ,对于服务器本身,它来自 USARSim Image Server。它提供了关于它将发送什么图像及其类型的信息 JF Sebastian,我可以尝试一下,顺便说一句 len(buff) 和 buff.__len__( )? ArminRigo那部分,我只是从网上复制了一段代码,还有一个原因是我不会根据上面的信息如何构造图像,
标签: python image networking binary