ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python RabbitMQ+RPC调用传输图片

2022-07-27 14:31:46  阅读:209  来源: 互联网

标签:字节 img python base64 bytes RabbitMQ RPC encoded cv


 

 

 

整理下用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。

 

 

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

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

     

标签:字节,img,python,base64,bytes,RabbitMQ,RPC,encoded,cv
来源: https://www.cnblogs.com/qingyuanzi/p/16524714.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有