index.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // 专门用于收藏品图片的水印处理方法
  2. export function addWatermarkToCollectionImage(imageUrl, options = {}) {
  3. return new Promise((resolve, reject) => {
  4. // console.log('开始处理水印,原图URL:', imageUrl);
  5. // 默认选项
  6. const {
  7. position = 'bottom-right',
  8. opacity = 0.6,
  9. scale = 0.15,
  10. margin = 15
  11. } = options;
  12. const image = new Image();
  13. const watermark = new Image();
  14. // 设置跨域属性,如果图片来自不同域
  15. image.crossOrigin = 'anonymous';
  16. watermark.crossOrigin = 'anonymous';
  17. let imagesLoaded = 0;
  18. function onImageLoad() {
  19. imagesLoaded++;
  20. // console.log(`图片加载完成 ${imagesLoaded}/2`);
  21. if (imagesLoaded === 2) {
  22. try {
  23. // 两张图片都加载完成
  24. const canvas = document.createElement('canvas');
  25. const ctx = canvas.getContext('2d');
  26. // 设置Canvas尺寸与主图片相同
  27. canvas.width = image.width;
  28. canvas.height = image.height;
  29. // console.log('Canvas尺寸:', canvas.width, 'x', canvas.height);
  30. // console.log('水印图片尺寸:', watermark.width, 'x', watermark.height);
  31. // 绘制主图片
  32. ctx.drawImage(image, 0, 0);
  33. // 计算水印尺寸
  34. const watermarkWidth = image.width * scale;
  35. const watermarkHeight = (watermark.height / watermark.width) * watermarkWidth;
  36. // console.log('计算后的水印尺寸:', watermarkWidth, 'x', watermarkHeight);
  37. // 设置透明度
  38. ctx.globalAlpha = opacity;
  39. // 计算水印位置
  40. let x, y;
  41. switch(position) {
  42. case 'top-left':
  43. x = margin;
  44. y = margin;
  45. break;
  46. case 'top-right':
  47. x = canvas.width - watermarkWidth - margin;
  48. y = margin;
  49. break;
  50. case 'bottom-left':
  51. x = margin;
  52. y = canvas.height - watermarkHeight - margin;
  53. break;
  54. case 'bottom-right':
  55. x = canvas.width - watermarkWidth - margin;
  56. y = canvas.height - watermarkHeight - margin;
  57. break;
  58. case 'center':
  59. x = (canvas.width - watermarkWidth) / 2;
  60. y = (canvas.height - watermarkHeight) / 2;
  61. break;
  62. default:
  63. x = canvas.width - watermarkWidth - margin;
  64. y = canvas.height - watermarkHeight - margin;
  65. }
  66. // console.log('水印位置:', x, y);
  67. // 绘制水印
  68. ctx.drawImage(watermark, x, y, watermarkWidth, watermarkHeight);
  69. // 将Canvas转换为Data URL
  70. const watermarkedImageUrl = canvas.toDataURL('image/png', 0.9);
  71. // console.log('水印处理完成,生成的URL长度:', watermarkedImageUrl.length);
  72. resolve(watermarkedImageUrl);
  73. } catch (error) {
  74. reject(new Error('图片加载失败'));
  75. }
  76. }
  77. }
  78. image.onload = onImageLoad;
  79. watermark.onload = onImageLoad;
  80. // 主图或水印加载失败时,直接返回原链接,避免继续添加水印造成反复报错
  81. image.onerror = () => {
  82. resolve(imageUrl);
  83. };
  84. watermark.onerror = () => {
  85. resolve(imageUrl);
  86. };
  87. // 开始加载图片
  88. // console.log('开始加载主图片:', imageUrl);
  89. image.src = imageUrl;
  90. // 直接使用相对路径加载水印图片
  91. // 测试使用
  92. // watermark.src = '/src/assets/img/waterMar.png';
  93. // 正式使用
  94. watermark.src = './waterMar.png';
  95. });
  96. }