发送PIL.Image到django服务器端并取回

时间:2018-07-16 06:40:52

标签: python django python-3.x python-imaging-library

我不知道将图像从客户端发送到服务器端的背后是什么,因此受以下情况困扰。

我想使用Python requests libPIL.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()并没有帮助。

2 个答案:

答案 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'])

来获取图像