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。

 

 

==========================题外话===========================

这是我的第一篇博客,如有纰漏,还请各位大佬评论区批评指正,一起进步,感谢支持。

 
 
 
posted @ 2022-07-27 14:25  氢原子i  阅读(118)  评论(0编辑  收藏  举报