python3+json+opencv的图片文件保存(base64和jpg编码)

想在网络中传输python字典,dict中包括图片数据和其他信息。

这里用到了json的保存和读取,也用到了base64和jpg的压缩,并且比较了jpg压缩和base64的文件大小比较

结论:

原图大小为500*348

原始numpy保存的数据量最大2617K

如果用jpg编码,可以压缩到755K,打开一看,里面一堆【】和逗号,还是很浪费

而使用base64的话,就会小很多。只有152k,虽然比起原图39k还有距离,不知道哪位可以解释一下。

不过也可以接受了。

import json
import cv2
from datetime import date, datetime
import numpy as np
import base64
class GEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        elif isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj, date):
            return obj.strftime('%Y-%m-%d')
        elif isinstance(obj, np.datetime64):
            return str(obj)[:10]
        elif isinstance(obj, bytes):
            return str(obj, encoding='utf-8');
        else:
            return super(GEncoder, self).default(obj)
# json.dumps(obj, cls=GEncoder)
class Gjson:
    def __init__(self):
        pass
    def JsonToString(self,data_json):
        data_string=json.dumps(data_json,cls=GEncoder)        
        return data_string
    def StringToJson(self,data_str):
        data_json=json.loads(data_str)
        return data_json
    def SaveToFile(self,fn,data_json):
        data_str=self.JsonToString(data_json)   
        with open(fn, 'w') as f:
            f.write(data_str)
            f.flush
        return True
    def ReadFromFile(self,fn):
        with open(fn, "rb") as json_file:
            data_str = json_file.read()
        data_json=self.StringToJson(data_str)
        return data_json
if __name__=="__main__":
    gj=Gjson()    
    fn_img="test.jpg"
    img=cv2.imread(fn_img)
    
    dict_1={}
    dict_2={}
    dict_3={}
    
    dict_1["img"]=img
    res,data_encoded=cv2.imencode('.jpg', img,[int(cv2.IMWRITE_JPEG_QUALITY),100])
    dict_2["img"]=data_encoded
    encoded_image = base64.b64encode(data_encoded)
    dict_3["img"]=encoded_image
    fn_1="img_numpy.json"
    fn_2="img_str.json"
    fn_3="img_base64.json"
    
    gj.SaveToFile(fn_1, dict_1)    
    gj.SaveToFile(fn_3, dict_3)
    gj.SaveToFile(fn_2, dict_2)
    
    o_1=gj.ReadFromFile(fn_1)
    o_2=gj.ReadFromFile(fn_2)
    o_3=gj.ReadFromFile(fn_3)
    
    img1=np.asarray(o_1["img"], dtype="uint8")
    img2=o_2["img"]
    img2=np.asarray(img2, dtype="uint8")
    img2=cv2.imdecode(img2, cv2.IMREAD_COLOR)
    
    img3=o_3["img"]
    img3=base64.b64decode(img3)
    img3 = np.fromstring(img3, np.uint8)
    img3=cv2.imdecode(img3, cv2.IMREAD_COLOR)
    
    cv2.imshow("o_1",img1)
    cv2.imshow("o_2",img2)
    cv2.imshow("o_3",img3)
    cv2.waitKey(0)
    
    

猜你喜欢

转载自blog.csdn.net/lianbus/article/details/108886956