gpt4 book ai didi

python - 二进制数据到图像原始python

转载 作者:太空宇宙 更新时间:2023-11-03 11:32:52 26 4
gpt4 key购买 nike

所以这就是我正在尝试做的事情:有这个图像服务器将在端口 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')

img = Image.fromstring('BRG', (1280, 720), imageData, 'raw')

我收到这个错误:

Value error: Unrecognized mode,

有人知道怎么解决这种问题吗?

最佳答案

当服务器和客户端的代码都完整给出时(但简化为仅显示问题),调试这些问题会更好。

因此,下面是一个基于您的初始代码和描述的非常基本的客户端。请注意,未使用 image_type,它就在那里,因为您提到您想要区分 JPEG 和 RAW。我总是假设接收到的数据是 RGB 数据,您可以根据您的实际问题进行调整。这里的主要区别在于 struct 的使用,这是一种以通用格式打包数据以通过网络发送并避免与字节顺序相关的问题的标准方法。此代码还需要接收图像宽度和高度(您的代码中没有),因此您可以在客户端重建图像。

import socket
import struct
from PIL import Image

def recv(sock, size):
data = ''
to_receive = size
while to_receive > 0:
data += sock.recv(size)
to_receive = size - len(data)
return data

serv_host = ''
serv_port = 5003

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((serv_host, serv_port))

s.settimeout(1)

image_type = struct.unpack('!b', recv(s, 1))[0]
print "Image type: %d" % image_type
image_size = struct.unpack('!i', recv(s, 4))[0]
print "Image size: %d" % image_size
image_width, image_height = struct.unpack('!hh', recv(s, 4))
print "Image dimensions: %d x %d" % (image_width, image_height)

# Receive image data
image_data = recv(s, image_size)
print len(image_data)

# When we receive the image, we send the acknowledgement.
s.send('OK')
s.close()

img = Image.fromstring('RGB', (image_width, image_height), image_data)
img.save('out.png')

由于不包括服务器,下面是一个遵循您描述的协议(protocol)的简单服务器。我没有费心去检查服务器中是否有完全接收到的数据。另请注意,此服务器仅提供运行时在命令行中指定的单个图像。再次,适应你的问题。另请注意,我没有发送图像模式,这可能是实际应用中的问题。

import sys
import socket
import struct
from PIL import Image

host = ''
port = 5003
backlog = 5

serv_img = Image.open(sys.argv[1])
simg_size = serv_img.size
serv_data = serv_img.tostring()
data_size = len(serv_data)

print "Serving data of size %d" % data_size

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(backlog)
while True:
client, address = s.accept()

client.sendall(struct.pack('!b', 1))
client.sendall(struct.pack('!i', data_size))
client.sendall(struct.pack('!hh', *simg_size))
client.sendall(serv_data)

data = client.recv(2)
if data == 'OK':
print "OK", address

client.close()

关于不使用 __len__ 的提示仅仅是因为它是 Python 中的一个特殊方法,由 len 本身调用。如果您没有任何充分的理由使用特殊方法,那就不要这样做。

关于python - 二进制数据到图像原始python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13852357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com