比较文件存为二进制流的大小与在opencv下的ndarray格式 发现 二进制的大小小很多
因为用到grpc 因此用grpc测试的,
server
from concurrent import futures
import logging
import grpc
import media_img_pb2
import media_img_pb2_grpc
rec_file = '20210611.rec'
def save2record(img, encoder) : #'media_img_pb2.MediaImage'''
with open(str(encoder) + '_' + rec_file,'wb') as fout:
fout.write(img)
class ImageStore (media_img_pb2_grpc.ImageStoreServicer):
def SaveVideo(self, request, context):
return media_img_pb2.SaveResult(msg="get person info done")
def SaveImage(self, request, context):
media_encoder = request.encoder
media_data = request.data
# media_img_pb2.MediaImage(encoder=media_encoder, data=media_data)
save2record(media_data, media_encoder)
return media_img_pb2.SaveResult(msg="image saved to file" + rec_file)
def GetImage(self, request, context):
with open(rec_file,'rb') as fread:
content = fread.read()
return media_img_pb2.MediaImage(encoder=0, data=content)
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
media_img_pb2_grpc.add_ImageStoreServicer_to_server(ImageStore(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
if __name__ == '__main__':
logging.basicConfig()
serve()
from __future__ import print_function
import logging
import grpc
import media_img_pb2
import media_img_pb2_grpc
img_file = "E:/source_code/media/2.jpg"
def gen_img (path, encoder): # encoder = 0: binary 1 -- ndarray
if encoder == 0:
with open(path, 'rb') as fin:
img_data = fin.read()
media_img_binary = media_img_pb2.MediaImage(encoder=0, data=img_data)
return media_img_binary
if encoder ==1:
import cv2
cv2_img = cv2.imread(path)
media_img_ndarry = media_img_pb2.MediaImage(encoder=1, data=cv2_img.tobytes())
return media_img_ndarry
return None
def genimg_byresponse(response):
data = response.data
with open('test.jpg','wb') as fout:
fout.write(data)
def run():
with grpc.insecure_channel('localhost:50051') as channel:
stub = media_img_pb2_grpc.ImageStoreStub(channel)
response_binary = stub.SaveImage(gen_img(img_file, 0))
response_ndarray = stub.SaveImage(gen_img(img_file, 1))
# response = stub.GetImage(media_img_pb2.Empty())
# genimg_byresponse(response)
# print("Greeter client received: " + response.msg )
if __name__ == '__main__':
logging.basicConfig()
run()
proto 文件:
syntax = 'proto3';
//import 'google.protobuf.empty.proto'; google.protobuf.Empty
message Empty {}
service ImageStore {
rpc SaveImage (MediaImage) returns (SaveResult);
rpc SaveVideo(stream MediaImage) returns (SaveResult);
rpc GetImage(Empty) returns (MediaImage);
}
message MediaImage {
int32 encoder = 1; // 0 -binary ; 1 - ndarray
bytes data = 2;
}
message SaveResult {
bool result =1;
int32 result_code = 2;
int32 event_id = 3;
string msg = 4;
}
结果: