class waterMarkHelper { /** * @description 绘制水印(图片) */ static addImage( origin_img_url, watermark_img_url, finish_cb, textOptions = null ) { if (origin_img_url == null || origin_img_url == "") return; const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d"); //原图片 var img_origin = new Image(); img_origin.src = origin_img_url; img_origin.crossOrigin = "anonymous"; //水印图片 if (watermark_img_url == null) watermark_img_url = "./static/img/watermark.png"; var img_watermark = new Image(); img_watermark.src = watermark_img_url; var that = this; img_origin.onerror = function () { img_origin.style.display = "none"; return; }; img_origin.onload = function () { // 创建canvas,并将创建的img绘制成canvas var origin_image_width = img_origin.width; var origin_image_height = img_origin.height; var watermark_image_width = img_watermark.width; var watermark_image_height = img_watermark.height; canvas.width = origin_image_width; canvas.height = origin_image_height; ctx.scale(1, 1); ctx.drawImage(img_origin, 0, 0); if (textOptions != null) { let fontSize = 20; //字体大小默认48 if (origin_image_width > 500) { fontSize = 24; } if (origin_image_width > 1000) { fontSize = 36; } if (origin_image_width > 2000) { fontSize = 48; } let textX = 0; let textY = 0; ctx.textAlign = "center"; ctx.textBaseline = "middle"; ctx.font = `${fontSize}px yahei sans-serif`; ctx.fillStyle = "#000000"; let textWidth = ctx.measureText(textOptions.content).width; if (textOptions.position == "center") { // 向右偏三个字体大小的位置 textX = origin_image_width / 2 + fontSize * 3; // 向下移动1.5个字体大小的位置 textY = fontSize * 1.5; } if (textOptions.position == "right") { ctx.textAlign = "right"; // 向右偏三个字体大小的位置 textX = origin_image_width - fontSize * 3 ; // 向下移动1.5个字体大小的位置 textY = fontSize * 1.5; } ctx.fillText(textOptions.content, textX, textY); } if (origin_image_width > watermark_image_width * 5) { //3列 var waterMark_width2 = origin_image_width / 5.0; var waterMark_ratio = waterMark_width2 / watermark_image_width; var space = waterMark_width2 * 0.5; var x_posi1 = space; var x_posi2 = space + waterMark_width2 + space; var x_posi3 = space + waterMark_width2 + space + waterMark_width2 + space; //console.log("3333"); that.DrawOneColumnLogo( ctx, origin_image_height, x_posi1, img_watermark, watermark_image_width, watermark_image_height, waterMark_ratio ); that.DrawOneColumnLogo( ctx, origin_image_height, x_posi2, img_watermark, watermark_image_width, watermark_image_height, waterMark_ratio ); that.DrawOneColumnLogo( ctx, origin_image_height, x_posi3, img_watermark, watermark_image_width, watermark_image_height, waterMark_ratio ); } else if (origin_image_width > watermark_image_width * 3.5) { //两列 var waterMark_width2 = origin_image_width / 3.5; var waterMark_ratio = waterMark_width2 / watermark_image_width; var space = waterMark_width2 * 0.5; var x_posi1 = space; var x_posi2 = space + waterMark_width2 + space; //console.log("2222"); that.DrawOneColumnLogo( ctx, origin_image_height, x_posi1, img_watermark, watermark_image_width, watermark_image_height, waterMark_ratio ); that.DrawOneColumnLogo( ctx, origin_image_height, x_posi2, img_watermark, watermark_image_width, watermark_image_height, waterMark_ratio ); } else { //一列 //console.log(origin_image_width,watermark_image_width,"1111"); var waterMark_width2 = origin_image_width / 2.0; var waterMark_ratio = waterMark_width2 / watermark_image_width; var left_posi = origin_image_width / 2 - waterMark_width2 / 2; that.DrawOneColumnLogo( ctx, origin_image_height, left_posi, img_watermark, watermark_image_width, watermark_image_height, waterMark_ratio ); } if (finish_cb != null) { // 将绘制完成的canvas转换为base64的地址 const base64Url = canvas.toDataURL("image/jpge", 0.5); //console.log(base64Url) finish_cb(base64Url); canvas.remove(); } }; } /** * @description */ static DrawOneColumnLogo( ctx, origin_image_height, left_posi, img_watermark, watermark_image_width, watermark_image_height, waterMark_ratio ) { var list_y = this.CalcOneColumnLogoPosi( origin_image_height, watermark_image_height, waterMark_ratio ); //console.log(list_y) for (var i = 0; i < list_y.length; i++) { var top_posi = list_y[i]; //var rect_2 = new RectangleF(left_posi, top_posi, watermark_image_width * waterMark_ratio, watermark_image_height * waterMark_ratio); //gh.DrawImage(img_watermark, rect_2); //console.log(left_posi,top_posi,watermark_image_width * waterMark_ratio,watermark_image_height * waterMark_ratio) ctx.drawImage( img_watermark, left_posi, top_posi, watermark_image_width * waterMark_ratio, watermark_image_height * waterMark_ratio ); } } /** * @description 计算一列的位置(等比例) */ static CalcOneColumnLogoPosi( image_height, waterMark_origin_height, waterMark_ratio ) { var space_height = 100; var top = 100; var bottom = 100; var watermark_image_height = waterMark_ratio * waterMark_origin_height; if (watermark_image_height > 250) { space_height = watermark_image_height * 1.5; top = watermark_image_height * 0.2; bottom = image_height - watermark_image_height * 1.2; } else { space_height = watermark_image_height * 1.8; top = watermark_image_height * 0.5; bottom = image_height - watermark_image_height * 1.5; } var num = (bottom - top) / space_height + 1; if (num <= 1) { space_height = watermark_image_height * 1.2; top = watermark_image_height * 0.2; bottom = image_height - watermark_image_height - 5; } else if (num == 2) { space_height = watermark_image_height * 1.3; top = watermark_image_height * 0.3; bottom = image_height - watermark_image_height - 5; } if (num > 5) { //每列最多5个 var space = (image_height - watermark_image_height * 5) / 6; var posi = []; for (var i = 0; i < 6; i++) { var top_posi = space + (watermark_image_height + space) * i; if (top_posi > image_height - watermark_image_height) return posi; posi.push(top_posi); } return posi; } else { var posi = []; for (var i = 0; i < 100; i++) { var top_posi = top + space_height * i; if (top_posi > bottom) return posi; posi.push(top_posi); } return posi; } } // 绘制水印(文字) static addCorpText(origin_img_url, content, position = "center", finish_cb) { // 创建所需要添加水印的img图片 const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d"); const img_origin = new Image(); img_origin.src = origin_img_url; img_origin.crossOrigin = "anonymous"; img_origin.onload = () => { let fontSize = 48; //字体大小默认十八 let textX = 0; let textY = 0; // 创建canvas,并将创建的img绘制成canvas canvas.width = img_origin.width; canvas.height = img_origin.height; ctx.drawImage(img_origin, 0, 0); ctx.textAlign = "center"; ctx.textBaseline = "middle"; ctx.font = `${fontSize}px 宋体`; ctx.fillStyle = "#000000"; // ctx.globalAlpha = 0.3; // ctx.rotate((Math.PI / 180) * 15); if (position == "center") { textX = img_origin.width / 2; textY = fontSize; } ctx.fillText(content, textX, textY); if (finish_cb != null) { // 将绘制完成的canvas转换为base64的地址 const base64Url = canvas.toDataURL("image/png", 0.8); finish_cb(base64Url); } }; } } export default waterMarkHelper;