You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
1.5 KiB

3 years ago
  1. // 全局保存 canvas 和 div ,避免重复创建(单例模式)
  2. const globalCanvas = null;
  3. const globalWaterMark = null;
  4. // 获取 toDataURL 的结果
  5. const getDataUrl = ({
  6. font = "16px normal",
  7. fillStyle = "rgba(180, 180, 180, 0.3)",
  8. textAlign,
  9. textBaseline,
  10. text = "test1233",
  11. }) => {
  12. const rotate = -20;
  13. const canvas = globalCanvas || document.createElement("canvas");
  14. const ctx = canvas.getContext("2d"); // 获取画布上下文
  15. ctx.rotate((rotate * Math.PI) / 180);
  16. ctx.font = font;
  17. ctx.fillStyle = fillStyle;
  18. ctx.textAlign = textAlign || "left";
  19. ctx.textBaseline = textBaseline || "middle";
  20. ctx.fillText(text, canvas.width / 3, canvas.height / 2);
  21. return canvas.toDataURL("image/png");
  22. };
  23. // 设置水印
  24. const setWaterMark = (el, binding) => {
  25. const { parentElement } = el;
  26. // 获取对应的 canvas 画布相关的 base64 url
  27. console.log(111111);
  28. const url = getDataUrl(binding);
  29. // 创建 waterMark 父元素
  30. const waterMark = globalWaterMark || document.createElement("div");
  31. waterMark.className = `water-mark`; // 方便自定义展示结果
  32. waterMark.setAttribute("style", `background-image: url(${url});`);
  33. // 将对应图片的父容器作为定位元素
  34. parentElement.setAttribute("style", "position: relative;");
  35. // 将图片元素移动到 waterMark 中
  36. parentElement.appendChild(waterMark);
  37. };
  38. const directives = {
  39. bind(el, binding) {
  40. el.onload = setWaterMark.bind(null, el, binding.value);
  41. },
  42. };
  43. export default {
  44. name: "watermark",
  45. directives,
  46. };