python RabbitMQ+RPC调用传输图片
整理下用RabbitMQ在client和Server之间用RPC调用传输图片的笔记
RPC:是远程过程调用。百度写了一大堆。此刻,我们简单点说:比如,我们在本地的代码中调用一个函数,那么这个函数不一定有返回值,但一定有返回。若是在分布式环境中,香我们前几章的例子,发送消息出去后,发送端是不清楚客户端处理完后的结果的。由于rabbitmq的响应机制,顶多能获取到客户端的处理状态,但并不能获取处理结果。那么,我们想像本地调用那样,需要客户端处理后返回结果该怎么办呢。就是如下图:
以上rpc内容来自:https://www.cnblogs.com/zijiyanxi/p/7663676.html
Python+Flask上传图片无法直接上传,只得采用Base64对图片进行转码,需引入Base64库
上代码!
import base64
#Flask配置文件
app.config['UPLOAD_FOLDER'] = './static/image/'
#转换成base64
def image2base64(img_name):
encoded=base64.b64encode(open(os.path.join(app.config['UPLOAD_FOLDER'], img_name), 'rb').read())
return encoded
base64.b64encode(s,altchars=None)
这个函数主要是将字节流(bytes)对象加密,并返回一个base64格式的字节流(bytes)对象,注意,是字节流对象, file.read()返回的也是字节流,这点很重要。
在客户端(client)发送请求之后,服务端(server)会对收到的图片进行处理,由于这个时候无法写入文件,所以只能采取另一种形式保存处理后的图片。
我采用的是通过openCv将图片转换成ndArray,再转换成bytes。
首先,客户端收到Bytes对象Base64格式的图片,需要先进行解码,
import cv2 as cv
import numpy as np
def base64ToImage(encoded):
decode = base64.b64decode(encoded)
#decode还是bytes对象
img_array = np.frombuffer(decode,np.uint8)
#img_array为ndArray对象
img = cv.imdecode(img_array, cv.COLOR_RGB2BGR)
#img为ndarray,三通道的,可以显示了
#cv.imshow('img',img)
#cv.waitKey()
return img
再通过opencv对图片进行你想要的操作,放射啊,旋转啊,镜像对称什么的等等
处理完之后,又得到ndarray类型的图片,需要再传递给client的话,则又是转换成base64
def image2base64(img):
#转换成base64
#cv.imshow('img',img)
#cv.waitKey(1000)
img_buffer = cv.imencode('.jpg',img)[1].tostring()
#img_buffer是字节流对象
encoded = base64.b64encode(img_buffer)
return encoded
然后再将byte传给client
====================注意!!!注意!!=======================
python在传字节流的时候,会在首部加一个b,作为表示,传过去之后,字节流首部会多出一个‘b"’,用repalce函数替换就可以了。
def base64Toimage(encoded,img_dst):
#将bytes对象转换为字符串对象
encoded_str = str(encoded,'utf-8')
#用空替换" b' "
encoded_str = encoded_str.replace("b'",'')
#在转换成bytes对象进行base64解码
encoded = bytes(encoded_str,'utf_8')
decode = base64.b64decode(encoded)
img_array = np.fromstring(decode, np.uint8)
# 转换成ndarray
img = cv.imdecode(img_array, cv.COLOR_RGB2BGR)
return img
不replace()的话,大概会报错,大概就是无效base64编码之类的,invalid Base64XXXX。
==========================题外话===========================
这是我的第一篇博客,如有纰漏,还请各位大佬评论区批评指正,一起进步,感谢支持。