python RabbitMQ+RPC调用传输图片
2022/7/28 1:22:49
本文主要是介绍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。
==========================题外话===========================
这是我的第一篇博客,如有纰漏,还请各位大佬评论区批评指正,一起进步,感谢支持。
这篇关于python RabbitMQ+RPC调用传输图片的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20Python编程入门指南
- 2024-12-20Python编程基础与进阶
- 2024-12-19Python基础编程教程
- 2024-12-19python 文件的后缀名是什么 怎么运行一个python文件?-icode9专业技术文章分享
- 2024-12-19使用python 把docx转为pdf文件有哪些方法?-icode9专业技术文章分享
- 2024-12-19python怎么更换换pip的源镜像?-icode9专业技术文章分享
- 2024-12-19Python资料:新手入门的全面指南
- 2024-12-19Python股票自动化交易实战入门教程
- 2024-12-19Python股票自动化交易入门教程
- 2024-12-18Python量化入门教程:轻松掌握量化交易基础知识