123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- """
- 数据集图片处理http接口
- """
- import os.path
- from flask import Blueprint, request, send_file
- from watermark_generate.domain import *
- from watermark_generate.domain.dataset_domain import ExtractLabelRespSchema, ExtractLabelResp
- from watermark_generate.tools.picture_watermark import PictureWatermarkEmbeder, extract
- from PIL import Image, ImageDraw
- dataset = Blueprint('dataset', __name__)
- # 允许的扩展名
- 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='No file part'))
- file = request.files['file']
- file_name = file.filename
- if file_name == '':
- return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='No selected file'))
- 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) # 保存图片到服务器
- # 嵌入水印
- embeder = PictureWatermarkEmbeder(label)
- try:
- embeder.embed(save_file_name, embed_file_name)
- except Exception as e:
- return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg=f'embed watermark to picture failed:{e}'))
- if not embeder.verify():
- return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg=f'水印嵌入验证失败,请更换图片'))
- # 随机添加噪声块
- img = Image.open(embed_file_name)
- draw = ImageDraw.Draw(img)
- noise_color = (128, 0, 128)
- for x in range(img.width - 3, img.width):
- for y in range(img.height - 3, img.height):
- draw.point((x, y), fill=noise_color)
- 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='File type not allowed'))
- @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'
- if not os.path.exists(save_file_name):
- return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='水印测试图片装载失败'))
- embeder = PictureWatermarkEmbeder('012ABCDEF')
- try:
- embeder.embed(save_file_name, embed_file_name)
- except Exception as e:
- return VerifyLabelRespSchema().dump(VerifyLabelRespSchema(code=-1, msg=f'水印嵌入图片失败:{e}'))
- if not embeder.verify():
- return VerifyLabelRespSchema().dump(VerifyLabelRespSchema(code=-1, msg=f'水印嵌入验证失败'))
- 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='No file part'))
- file = request.files['file']
- file_name = file.filename
- if file_name == '':
- return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='No selected file'))
- 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) # 保存图片到服务器
- secret = extract(save_file_name)
- return ExtractLabelRespSchema().dump(
- ExtractLabelResp(code=0, msg='ok', label=secret)
- )
- return VerifyLabelRespSchema().dump(VerifyLabelRespSchema(code=-1, msg=f'文件格式不支持'))
|