图片加水印
// 加水印--全屏覆盖
export function getImgUrl( { // 1
url = '',
content = '请勿外传',
callback = null,
} = {} ) {
// 创建所需要添加水印的img图片
let textAlign = 'left'
let font = "30px Microsoft Yahei"
let fillStyle = 'rgba(171,39,37, 0.8)'
const img = new Image();
img.src = url;
img.crossOrigin = "anonymous";
return new Promise( ( resolve ) => {
img.onload = function () {
const canvas = document.createElement( 'canvas' );
canvas.width = img.width; // 4
canvas.height = img.height;
const ctx = canvas.getContext( '2d' );
let wmConfig = {
font: 'microsoft yahei',
textArray: [ content ],
density: 2.5
}
let fontSize = 30;
ctx.drawImage( img, 0, 0, img.width, img.height );
ctx.textAlign = textAlign; // 5
ctx.font = font;
ctx.fillStyle = fillStyle;
// ctx.fillText( content, 10, 20 );
// //文字坐标
let imgWidth = canvas.width;
let imgHeight = canvas.height;
const maxPx = Math.max( imgWidth, imgHeight );
const stepPx = Math.floor( maxPx / wmConfig.density );
let arrayX = [ 0 ]; //初始水印位置 canvas坐标 0 0 点
while ( arrayX[ arrayX.length - 1 ] < maxPx / 2 ) {
arrayX.push( arrayX[ arrayX.length - 1 ] + stepPx );
}
arrayX.push( ...arrayX.slice( 1, arrayX.length ).map( ( el ) => {
return -el;
} ) );
for ( let i = 0; i < arrayX.length; i++ ) {
for ( let j = 0; j < arrayX.length; j++ ) {
ctx.save();
ctx.translate( 300 / 2, 200 / 2 ); ///画布旋转原点 移到 图片中心
ctx.rotate( -Math.PI / 5 );
if ( wmConfig.textArray.length > 3 ) { //最多显示三行水印,也可以根据需要自定义
wmConfig.textArray = wmConfig.textArray.slice( 0, 3 );
}
wmConfig.textArray.forEach( ( el, index ) => {
let offsetY = fontSize * index + 2;
ctx.fillText( el, arrayX[ i ], arrayX[ j ] + offsetY );
} );
ctx.restore();
}
}
let base64Url = '';
base64Url = canvas.toDataURL( "image/jpeg", 0.5 ); // 6
resolve( base64Url )
}
} );
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律