dataset_controller.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. """
  2. 数据集图片处理http接口
  3. """
  4. import os.path
  5. from flask import Blueprint, request, send_file
  6. from watermark_generate.domain import *
  7. from watermark_generate.domain.dataset_domain import ExtractLabelRespSchema, ExtractLabelResp
  8. from watermark_generate.tools.picture_watermark import PictureWatermarkEmbeder, extract
  9. from PIL import Image, ImageDraw
  10. dataset = Blueprint('dataset', __name__)
  11. # 允许的扩展名
  12. ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg'}
  13. # 判断文件扩展名是否合法
  14. def allowed_file(filename):
  15. return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
  16. # 获取文件扩展名
  17. def get_file_extension(filename):
  18. return filename.rsplit('.', 1)[1].lower()
  19. @dataset.route('/znwr/jit/ai/v1/picture_embed', methods=['POST'])
  20. def picture_embed_label():
  21. """
  22. 上传图片,嵌入密码标签,进行处理、
  23. label: 密码标签
  24. file: 上传的图像
  25. :return: 成功:处理完成的图像二进制流 失败:{code: -1, msg:'错误信息'}
  26. """
  27. label = request.form.get('label')
  28. if 'file' not in request.files:
  29. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='No file part'))
  30. file = request.files['file']
  31. file_name = file.filename
  32. if file_name == '':
  33. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='No selected file'))
  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. # 嵌入水印
  40. embeder = PictureWatermarkEmbeder(label)
  41. try:
  42. embeder.embed(save_file_name, embed_file_name)
  43. except Exception as e:
  44. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg=f'embed watermark to picture failed:{e}'))
  45. if not embeder.verify():
  46. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg=f'水印嵌入验证失败,请更换图片'))
  47. # 随机添加噪声块
  48. img = Image.open(embed_file_name)
  49. draw = ImageDraw.Draw(img)
  50. noise_color = (128, 0, 128)
  51. for x in range(img.width - 3, img.width):
  52. for y in range(img.height - 3, img.height):
  53. draw.point((x, y), fill=noise_color)
  54. img.save(embed_file_name)
  55. # 确定文件的MIME类型
  56. if file_extension == 'jpg' or file_extension == 'jpeg':
  57. mimetype = 'image/jpeg'
  58. elif file_extension == 'png':
  59. mimetype = 'image/png'
  60. else:
  61. # 如果无法确定文件类型,默认使用二进制流
  62. mimetype = 'application/octet-stream'
  63. return send_file(open(embed_file_name, 'rb'), mimetype=mimetype, download_name=embed_file_name)
  64. else:
  65. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='File type not allowed'))
  66. @dataset.route('/znwr/jit/ai/v1/picture_check', methods=['POST'])
  67. def picture_embed_check():
  68. """
  69. 图片嵌入水印功能自检
  70. :return: 自检结果
  71. """
  72. save_file_name = './resource/test.jpg'
  73. embed_file_name = './resource/test_embed.jpg'
  74. if not os.path.exists(save_file_name):
  75. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='水印测试图片装载失败'))
  76. embeder = PictureWatermarkEmbeder('012ABCDEF')
  77. try:
  78. embeder.embed(save_file_name, embed_file_name)
  79. except Exception as e:
  80. return VerifyLabelRespSchema().dump(VerifyLabelRespSchema(code=-1, msg=f'水印嵌入图片失败:{e}'))
  81. if not embeder.verify():
  82. return VerifyLabelRespSchema().dump(VerifyLabelRespSchema(code=-1, msg=f'水印嵌入验证失败'))
  83. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=0, msg='ok'))
  84. @dataset.route('/znwr/jit/ai/v1/picture_extract', methods=['POST'])
  85. def picture_embed_extract():
  86. """
  87. 图片水印提取
  88. :return: 提取结果
  89. """
  90. if 'file' not in request.files:
  91. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='No file part'))
  92. file = request.files['file']
  93. file_name = file.filename
  94. if file_name == '':
  95. return VerifyLabelRespSchema().dump(VerifyLabelResp(code=-1, msg='No selected file'))
  96. if file and allowed_file(file_name):
  97. file_extension = get_file_extension(file_name)
  98. save_file_name = f'extract_image.{file_extension}'
  99. file.save(save_file_name) # 保存图片到服务器
  100. secret = extract(save_file_name)
  101. return ExtractLabelRespSchema().dump(
  102. ExtractLabelResp(code=0, msg='ok', label=secret)
  103. )
  104. return VerifyLabelRespSchema().dump(VerifyLabelRespSchema(code=-1, msg=f'文件格式不支持'))