Flask框架下图像的base64编码接收和解码流程

一、Flask简介

Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。

二、Flask启动代码

Flask的安装也比较简单,百度上有很多教程,建立一个app_VD.py,代码如下:

python 复制代码
from flask import Flask
from flask_cors import CORS
from VideoDiagnose import vd_Process

#加载配置
app = Flask(__name__)
app.config.from_pyfile("config.py")
CORS(app)

app.register_blueprint(vd_Process, url_prefix="/")

#启动算法sever
if __name__ == '__main__':

    app.run(host=app.config['HOST'], port=app.config['PORT'], debug=app.config['DEBUG'])

其中, config.py为配置文件,内容参考代码段如下:

python 复制代码
PORT = '5585'
HOST = '0.0.0.0'
DEBUG = True

以上为Flask启动流程,直接使用python app_VD.py即可执行程序,执行后输出:

三、base64图像部分设计

3.1 json参数

通过postman以post的方式发送图像json文件,内容如下:

python 复制代码
{
    "algConfig": {
        "b_colordistortion": 1,
        "b_contrast": 1,
        "b_definition": 1,
        "b_noise": 1,
        "b_shade": 1,
        "b_signalloss": 1,
        "b_strip": 1,
        "b_highBrightness": 1,
        "b_lowBrightness": 1,
        "b_stationaryframe": 1,
        "f_Quality": 0.2
    },
    "images": [
        {
            "base64Data": "/9j//gARTGF2YzU4LjEzNC4xMDAA/9sAQwAIBAQEBAQFBQUFBQUGBgYGBgYGBgYGBgYGBwcHCAgIBwcHBgYHBwgICAgJCQkICAgICQkKCgoMDAsLDg4OEREU/90ABAAU/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+hEAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/8AAEQgAtAFAAwEiAAIRAAMRAP/aAAwDAQACEQMRAD8A9VopaSgAopaSgBaKSlBoAOtFLSdaADFFLSYoAKSnUlABRiiigAxRRRQAlFGKKAClpKKAFoozRmgAoozRmgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Q9WopBS0AFFFFABRRRigBDQKXFHagAooooAKKM0CgAwaKWkNABRRiigApKWigAxSYpeaTmgAopcUYoASilxRigBKM0tFABmjNFFABmjNFIaAFzRmkooAXNGaSigBc0ZpKKAFzRmkxRigBc0ZpMUYoA//R9VpaKKACiijFABRRiigBDS0mKWgBKKWigBKKXFAoASjvS0UABpKXijFACUUvFFABSUYoxQAc0UtFACUUuKMUAJRS4oxQAlFLijFACUUuKMUAJRilxRQAYpKWigBKWk5oxQAtFJijFAC0UlGKAP/S9WopMUYoAWikxRigBaKTFLQAUUUUAFFFFABRRRmgAo70UUAApaSloAKbinUnFABikpaKAEpaDSUALRSUUALRRijFABRRijFABRRRigAooooAKKKKACiiigAooooAKKKKAP/T9WooooAKKM0maAFoo4ooAKKKKAAUopOaU0ABpKKKACiiigAoFFFAAaKMUUAApeKSigAooooAKWiigBKKWjigBKKXijigBKKXiigBKKWigAxRiiigBMUUtJQAUUUUAFFGKXFAH//U9WpM0tGaADFFGaKACg0Cl5oASgUc0UAFFFGaACijFGKACilxRQAlLRSUAHNLRSUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFLSCloASil4o4oAMUhpaKACikooAWikooA//1fVqWkooAWkpeaOaACijmjmgApKKOaADFLRRQAnNFLijFACZopcUYoASloxRQAhopaMUAJRS4oxQAlFLijFACUUuKMUAJRS4oxQAlFLijFACUUtFABRRSUALRSUtACUtJRQAtJS0UAJRS0lAH//W9Wo5oooAWikooAXmikooAKKKKAFpKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKMUUUAGKKKKAFopKKAFpKKXFAH//X9WoooxQAUUUUAApeaMUlABRRmlzQAlFLmjNACUUuaM0AJRS5ozQAlFLmjNACUUuaM0AJRS5ozQAlFLmjNACUUuaM0AJRS5ozQAlFLmjNACUUuaM0AJS8UZozQAlFLmjNACUUuaM0AJRS5ozQAUlLmkoA/9D1ajmilxQAUUUUAFJQaKACiiigAooooAKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKWkoA/9H1fNGaSg0ALSUUUAFFFFABS8UlFAC8UUlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UUlAC0UlFAC0ZpKKAFpKKXFAH//0vV+9HajvR2oAKQ0tIaACiiigAooooAKKKKACiiigAooooABS0CigAooooAKKKKACiiigAooooAKKKKACiiigBDRQaKACiiigANLSGlFABijFFFABiiiigBD1o60HrQKAP/Z"
        }
    ]
}

3.2 接收部分代码

也就是base64部分的json数据接收和图像解析代码,解析文件为VideoDiagnose.py,代码内容如下:

python 复制代码
import os
import cv2
import requests
import base64
import json
import threading
import numpy as np
import time
import datetime
from flask import Blueprint
from flask import request
from flask import current_app as app
import queue

vd_Process = Blueprint('vd_Process', __name__)
device = torch.device('cpu')

def image_to_base64(filepath):

    """将 JPG 文件转换为 Base64 编码字符串"""
    with open(filepath, "rb") as image_file:
        # 读取文件内容到字节串
        encoded_string = base64.b64encode(image_file.read())
        # 将字节串解码为 UTF-8 字符串
        return encoded_string.decode('utf-8')

def base64_to_image(base64_string):

    # Base64 字符串解码为字节
    img_data = base64.b64decode(base64_string)
    # 将字节转换为 NumPy 数组
    nparr = np.frombuffer(img_data, np.uint8)
    # 解码图像
    img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    # cv2.imshow("img",img)
    # cv2.waitKey(0)

    return img

def vqd_detect(json_data):

    images_Array = []
    try:#检测参数是否正确
        b_colordistortion = json_data["algConfig"]['b_colordistortion']#1
        b_contrast = json_data["algConfig"]['b_contrast']#2
        b_definition = json_data["algConfig"]['b_definition']#3
        b_noise = json_data["algConfig"]['b_noise']#4
        b_shade = json_data["algConfig"]['b_shade']#5
        b_signalloss = json_data["algConfig"]['b_signalloss']#6
        b_strip = json_data["algConfig"]['b_strip']#7
        b_highBrightness = json_data["algConfig"]['b_highBrightness']#8
        b_lowBrightness =  json_data["algConfig"]['b_lowBrightness']#9
        b_stationaryframe = json_data["algConfig"]['b_stationaryframe']#10
        f_Quality = json_data["algConfig"]['f_Quality']

        images = json_data['images']
        for image_data in images:
            base64_data = image_data["base64Data"]
            if len(base64_data) > 2000:
                images_Array.append(base64_data)

    except Exception as e:
        return "Json_Params_Error",{}

    if len(images_Array) == 0 or len(images_Array) > 3:
        return "No_images_Error",{}

    decodeImageArray = []
    try:#图像转换,变成CV图像
        for image_data in images_Array:
            cvImage = base64_to_image(image_data)
            decodeImageArray.append(cvImage)
    except Exception as e:
        return "Image_Params_Error",{}

    out_Result = {}
    out_Result["b_normal"] = 0#0
    #out_Result["n_normal"] = 1.0
    out_Result["b_colordistortion"] = 0#1
    out_Result["n_colordistortion"] = 1.0
    out_Result["b_contrast"] = 0#2
    out_Result["n_contrast"] = 1.0
    out_Result["b_definition"] = 0#3
    out_Result["n_definition"] = 1.0
    out_Result["b_noise"] = 0#4
    out_Result["n_noise"] = 1.0
    out_Result["b_shade"] = 0#5
    out_Result["n_shade"] = 1.0
    out_Result["b_signalloss"] = 0#6
    out_Result["n_signalloss"] = 1.0
    out_Result["b_strip"] = 0#7
    out_Result["n_strip"] = 1.0
    out_Result["b_highBrightness"] = 0#8
    out_Result["n_highBrightness"] = 1.0
    out_Result["b_lowBrightness"] = 0#9
    out_Result["n_lowBrightness"] = 1.0
    out_Result["b_stationaryframe"] = 0#10
    out_Result["n_stationaryframe"] = 1.0

    cvResizeImage = cv2.resize(decodeImageArray[len(decodeImageArray) - 1], [480, 270])
    gray_image = cv2.cvtColor(cvResizeImage, cv2.COLOR_BGR2GRAY)
    cv2.imshow("image", cvResizeImage)
    cv2.imshow("cut", cvResizeImage)
    cv2.waitKey(0)

    return "success",out_Result

@vd_Process.route('/vd_Process', methods=['POST'])
def handel_VD_Process():

    timestamp = time.time()
    format_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(timestamp))
    print(format_time)

    try:
        json_data = request.json
    except Exception as e:
        headers = {"Content-Type": "application/json"}
        json_send_data = {
            "data": {
                "status": "Json_GET_Error",
                "executeTime": format_time,
                "result": {}
            }
        }
        return json_send_data, 200, headers

    status,out_Result = vqd_detect(json_data)

    headers = {"Content-Type": "application/json"}
    json_send_data = {
        "data": {
            "status": status,
            "executeTime": format_time,
            "result": out_Result
        }
    }
    return json_send_data, 200, headers

if __name__ == '__main__':

    print()

四、运行结果

Flask执行后的状态得到一张灰白图像。 postman输出的结果如下内容所示:

python 复制代码
{
    "data": {
        "executeTime": "2024-07-03 20:06:30",
        "result": {
            "b_colordistortion": 0,
            "b_contrast": 0,
            "b_definition": 0,
            "b_highBrightness": 0,
            "b_lowBrightness": 0,
            "b_noise": 0,
            "b_normal": 0,
            "b_shade": 0,
            "b_signalloss": 0,
            "b_stationaryframe": 0,
            "b_strip": 0,
            "n_colordistortion": 1.0,
            "n_contrast": 1.0,
            "n_definition": 1.0,
            "n_highBrightness": 1.0,
            "n_lowBrightness": 1.0,
            "n_noise": 1.0,
            "n_shade": 1.0,
            "n_signalloss": 1.0,
            "n_stationaryframe": 1.0,
            "n_strip": 1.0
        },
        "status": "success"
    }
}
相关推荐
belldeep9 小时前
python:用 Flask 3 , mistune 2 和 mermaid.min.js 10.9 来实现 Markdown 中 mermaid 图表的渲染
javascript·python·flask
喵手9 小时前
Python爬虫实战:电商价格监控系统 - 从定时任务到历史趋势分析的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·电商价格监控系统·从定时任务到历史趋势分析·采集结果sqlite存储
喵手9 小时前
Python爬虫实战:京东/淘宝搜索多页爬虫实战 - 从反爬对抗到数据入库的完整工程化方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·京东淘宝页面数据采集·反爬对抗到数据入库·采集结果csv导出
Honmaple9 小时前
OpenClaw 实战经验总结
后端
B站_计算机毕业设计之家9 小时前
猫眼电影数据可视化与智能分析平台 | Python Flask框架 Echarts 推荐算法 爬虫 大数据 毕业设计源码
python·机器学习·信息可视化·flask·毕业设计·echarts·推荐算法
PPPPPaPeR.9 小时前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法
golang学习记9 小时前
Go 嵌入结构体方法访问全解析:从基础到进阶陷阱
后端
JaydenAI9 小时前
[拆解LangChain执行引擎] ManagedValue——一种特殊的只读虚拟通道
python·langchain
骇城迷影9 小时前
Makemore 核心面试题大汇总
人工智能·pytorch·python·深度学习·线性回归
长安牧笛9 小时前
反传统学习APP,摒弃固定课程顺序,根据用户做题正确性,学习速度,动态调整课程难度,比如某知识点学不会,自动推荐基础讲解和练习题,学习后再进阶,不搞一刀切。
python·编程语言