我不知道将图像从客户端发送到服务器端的背后是什么,因此受以下情况困扰。
我想使用Python requests lib将PIL.Image
对象发送到django服务器端,并取回它,以便在服务器端使用PIL.Image
对象。
如我所测试的,如果发送PIL.Image
对象而不进行任何转换,那就是
r = requests.post(SERVER_URL,
data={
'image': PILimage,#PILimage is of type PIL.Image
'wordPos':(86,23)
},
)
然后我在服务器端刚得到一个值为str
的{{1}}对象,我猜它是由<PIL.PngImagePlugin.PngImageFile image mode=RGB size=149x49 at 0x13F25D0>
引起的,它将requests
对象转换为{{ 1}}在发送之前是对象,因此为什么PIL.Image
进行转换?为什么我们不能在没有Internet转换的情况下发送str
对象?请在这里给出一些解释,谢谢!
有人告诉我,我可以将requests
对象转换为PIL.Image
形式然后进行发送,即
PIL.Image
但是然后如何将图像恢复到服务器端的bytes
对象上?看来PIL.Image.frombytes()并没有帮助。
答案 0 :(得分:0)
任何经过电线的东西都必须是一个字节序列,以及解释这些字节的方式(如果协议没有规定某些特定含义的话)。用HTTP术语来说,这意味着您必须添加一个Content-Type标头,声明对所发送字节的解释。
您可以:
>>> import io
>>> file_like_object = io.BytesIO()
>>> PILImage.save(file_like_object, format='png')
然后,您的POST请求应具有标头Content-Type: image/png
,并发送file_like_object.getvalue()
作为请求的正文。
答案 1 :(得分:0)
用于发送图像
def myOCR(PILimage, wordPos):
image = io.BytesIO()
PILimage.save(image, 'png') # 没有什么类型,这里就任意指定个吧;For images created by the library itself (via a factory function, or by running a method on an existing image), this attribute is set to None.
image.seek(0) # 要回到开始才行,不然后面requests读的时候会从结尾读,读不到数据
r = requests.post(SERVER_URL,
files={'image': image},
data={'wordPos': wordPos}
)
result = r.json()
return result['word']
在Django方面,可以使用Image.open(request.FILES['image'])