dataset_controller.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. """
  2. 数据集图片处理http接口
  3. """
  4. from flask import Blueprint, request, send_file
  5. from watermark_generate.domain import *
  6. from watermark_generate.tools import logger_tool
  7. from PIL import Image
  8. dataset = Blueprint('dataset', __name__)
  9. logger = logger_tool.logger
  10. # 允许的扩展名
  11. ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg'}
  12. # 判断文件扩展名是否合法
  13. def allowed_file(filename):
  14. return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
  15. # 获取文件扩展名
  16. def get_file_extension(filename):
  17. return filename.rsplit('.', 1)[1].lower()
  18. @dataset.route('/znwr/jit/ai/v1/picture_embed', methods=['POST'])
  19. def picture_embed_label():
  20. """
  21. 上传图片,嵌入密码标签,进行处理、
  22. label: 密码标签
  23. file: 上传的图像
  24. :return: 成功:处理完成的图像二进制流 失败:{code: -1, msg:'错误信息'}
  25. """
  26. label = request.form.get('label')
  27. if 'file' not in request.files:
  28. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='没有上传文件'))
  29. file = request.files['file']
  30. file_name = file.filename
  31. logger.debug(f'label: {label},upload_file_name: {file_name}')
  32. if file_name == '':
  33. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='上传文件名为空'))
  34. if file and allowed_file(file_name):
  35. file_extension = get_file_extension(file_name)
  36. save_file_name = f'uploaded_image.{file_extension}'
  37. embed_file_name = f'embed_image.{file_extension}'
  38. file.save(save_file_name) # 保存图片到服务器
  39. # todo 修改图片嵌入水印流程
  40. # 在图片的任意位置添加随机数量和大小的噪声块
  41. img = Image.open(embed_file_name)
  42. # 保存修改后的图片
  43. img.save(embed_file_name)
  44. # 确定文件的MIME类型
  45. if file_extension == 'jpg' or file_extension == 'jpeg':
  46. mimetype = 'image/jpeg'
  47. elif file_extension == 'png':
  48. mimetype = 'image/png'
  49. else:
  50. # 如果无法确定文件类型,默认使用二进制流
  51. mimetype = 'application/octet-stream'
  52. return send_file(open(embed_file_name, 'rb'), mimetype=mimetype, download_name=embed_file_name)
  53. else:
  54. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='文件类型不允许,只允许jpg,jpeg,png文件类型'))
  55. @dataset.route('/znwr/jit/ai/v1/picture_check', methods=['POST'])
  56. def picture_embed_check():
  57. """
  58. 图片嵌入水印功能自检
  59. :return: 自检结果
  60. """
  61. save_file_name = './resource/test.jpg'
  62. embed_file_name = './resource/test_embed.jpg'
  63. # todo 修改水印功能自检
  64. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=0, msg='ok'))
  65. @dataset.route('/znwr/jit/ai/v1/picture_extract', methods=['POST'])
  66. def picture_embed_extract():
  67. """
  68. 图片水印提取
  69. :return: 提取结果
  70. """
  71. if 'file' not in request.files:
  72. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='没有上传文件'))
  73. file = request.files['file']
  74. file_name = file.filename
  75. logger.debug(f'上传文件名称:{file_name}')
  76. if file_name == '':
  77. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='上传文件名为空'))
  78. if file and allowed_file(file_name):
  79. file_extension = get_file_extension(file_name)
  80. save_file_name = f'extract_image.{file_extension}'
  81. file.save(save_file_name) # 保存图片到服务器
  82. # todo 修改水印提取功能
  83. return VerifyLabelRespSchema().dump(VerifyLabelRespSchema(code=-1, msg=f'文件格式不支持,仅支持jpg,jpeg,png格式'))