微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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。

 

 

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

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

     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐