""" 数据集图片处理http接口 """ from flask import Blueprint, request, send_file from watermark_generate.domain import * from watermark_generate.tools import logger_tool from PIL import Image dataset = Blueprint('dataset', __name__) logger = logger_tool.logger # 允许的扩展名 ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg'} # 判断文件扩展名是否合法 def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS # 获取文件扩展名 def get_file_extension(filename): return filename.rsplit('.', 1)[1].lower() @dataset.route('/znwr/jit/ai/v1/picture_embed', methods=['POST']) def picture_embed_label(): """ 上传图片,嵌入密码标签,进行处理、 label: 密码标签 file: 上传的图像 :return: 成功:处理完成的图像二进制流 失败:{code: -1, msg:'错误信息'} """ label = request.form.get('label') if 'file' not in request.files: return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='没有上传文件')) file = request.files['file'] file_name = file.filename logger.debug(f'label: {label},upload_file_name: {file_name}') if file_name == '': return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='上传文件名为空')) if file and allowed_file(file_name): file_extension = get_file_extension(file_name) save_file_name = f'uploaded_image.{file_extension}' embed_file_name = f'embed_image.{file_extension}' file.save(save_file_name) # 保存图片到服务器 # todo 修改图片嵌入水印流程 # 在图片的任意位置添加随机数量和大小的噪声块 img = Image.open(embed_file_name) # 保存修改后的图片 img.save(embed_file_name) # 确定文件的MIME类型 if file_extension == 'jpg' or file_extension == 'jpeg': mimetype = 'image/jpeg' elif file_extension == 'png': mimetype = 'image/png' else: # 如果无法确定文件类型,默认使用二进制流 mimetype = 'application/octet-stream' return send_file(open(embed_file_name, 'rb'), mimetype=mimetype, download_name=embed_file_name) else: return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='文件类型不允许,只允许jpg,jpeg,png文件类型')) @dataset.route('/znwr/jit/ai/v1/picture_check', methods=['POST']) def picture_embed_check(): """ 图片嵌入水印功能自检 :return: 自检结果 """ save_file_name = './resource/test.jpg' embed_file_name = './resource/test_embed.jpg' # todo 修改水印功能自检 return VerifyLabelRespSchema().dump(VerifyLabelResp(code=0, msg='ok')) @dataset.route('/znwr/jit/ai/v1/picture_extract', methods=['POST']) def picture_embed_extract(): """ 图片水印提取 :return: 提取结果 """ if 'file' not in request.files: return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='没有上传文件')) file = request.files['file'] file_name = file.filename logger.debug(f'上传文件名称:{file_name}') if file_name == '': return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='上传文件名为空')) if file and allowed_file(file_name): file_extension = get_file_extension(file_name) save_file_name = f'extract_image.{file_extension}' file.save(save_file_name) # 保存图片到服务器 # todo 修改水印提取功能 return VerifyLabelRespSchema().dump(VerifyLabelRespSchema(code=-1, msg=f'文件格式不支持,仅支持jpg,jpeg,png格式'))