picture_watermark.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. """
  2. 图片嵌入水印工具类
  3. """
  4. from watermark_generate.blind_watermark import WaterMark
  5. from watermark_generate.tools import logger_tool
  6. logger = logger_tool.logger
  7. class PictureWatermarkEmbeder:
  8. def __init__(self, secret):
  9. """
  10. 初始化图片盲水印嵌入器
  11. :param secret: 密码标签
  12. """
  13. self.bwm = WaterMark(password_img=1, password_wm=1)
  14. self.bwm.read_wm(secret, mode='str')
  15. self.secret = secret
  16. self.dest_img = None
  17. def embed(self, src_img, dest_img):
  18. """
  19. 盲水印嵌入方法
  20. :param src_img: 原始图片位置
  21. :param dest_img: 嵌入图片存放位置
  22. """
  23. self.bwm.read_img(src_img)
  24. self.bwm.embed(dest_img)
  25. self.dest_img = dest_img
  26. logger.debug(f'嵌入图片位置{self.dest_img}')
  27. def verify(self) -> bool:
  28. """
  29. 验证嵌入结果,检查嵌入的字符串与提取字符串是否一致
  30. :return: 嵌入结果
  31. """
  32. wm_extract = self.bwm.extract(self.dest_img, wm_shape=self.bwm.wm_size, mode='str')
  33. logger.debug(f'初始水印{self.secret},水印长度{self.bwm.wm_size},水印提取{wm_extract}')
  34. return wm_extract == self.secret
  35. def extract(embed_img, secret_len=512):
  36. bwm = WaterMark(password_img=1, password_wm=1)
  37. # todo 根据生成的密码标签长度修改此处计算水印长度函数
  38. secret = bwm.extract(embed_img, wm_shape=get_wm_bit(secret_len), mode='str')
  39. logger.debug(f'水印长度{get_wm_bit(secret_len)},水印提取{secret}')
  40. return secret
  41. def get_wm_bit(len):
  42. return len * 8 - 2