小程序在线图片加水印
参考:https://www.freesion.com/article/5065160137/
https://blog.csdn.net/Li_Ning21/article/details/134050960
MarkwaterMark.js
function createPromise(callback){
return new Promise((resolve,reject)=>{
callback(resolve,reject)
})
}
/**
* 制作水印图片
*/
class MarkwaterMark{
constructor(options){
/* 初始化配置 */
this.platform = null
this.pixelRatio = null
this.context = null
this.options = options
this.ready = createPromise(this._init.bind(this))
/* 生成组件方法 */
this.make = (cb) => {
if(this.context){
this._markPicture(cb)
}else{
this.ready.then(()=>{
this.context && this._markPicture(cb)
})
}
}
}
// 加载图片
_loadImage(url) {
let self = this;
const image = this.node.createImage()
// 等待图片加载
return new Promise(resolve => {
image.onload = function() {
console.log('image', image)
resolve(image)
}
image.src = url // 要加载的图片 url
})
}
/* 初始化方法 */
_init(next,fail){
const { platform , pixelRatio } = wx.getSystemInfoSync()
this.platform = platform
this.pixelRatio = pixelRatio
const query = wx.createSelectorQuery()
query.select('#' + this.options.id ).fields({
node: true,
size: true
}).exec((res)=>{
let {
node,
} = res[0] || {}
if (!node) return fail && fail()
this.context = node.getContext('2d')
this.node = node
next()
})
}
/* 制作水印图片 */
async _markPicture(cb) {
const { bg ,color ,content , rotate } = this.options
let image = await this._loadImage('http://cdn.dev.terran.wxpai.cn/upload/sandbox/7ac60b90-ed6c-482f-8f96-4d8e322001ed.jpeg')
// 设置canvas宽高
let width = image.width;
let height = image.height;
this.node.width = width;
this.node.height = height;
this.context.fillStyle = bg || '#fff'
this.context.fillRect(0, 0, width, height)
this.context.fillStyle = color || '#000'
this.context.font = `normal 400 12px Microsoft JhengHei`
this.context.save()
this.context.drawImage(image, 0, 0, width, height)//在画布上绘入图片,参数含义移步手册。
this.context.rotate(Math.PI * rotate / 180 )
//对斜对角线以左部分进行文字的填充
for (let j = 1; j < 20; j++) {
// this.context.beginPath();
this.context.fillText(content, 0, (50 + j) * j);
for (let i = 1; i < 20; i++) {//这个for循环代表横向循环,
// this.context.beginPath();
this.context.fillText(content, (80 + j) * i, (50 + i) * j);
}
}
//对斜对角线以右部分进行文字的填充逻辑同上
for (let j = 0; j < 20; j++) {
this.context.fillText(content, 0, (50 + j) * j);
for (let i = 1; i < 20; i++) {
this.context.fillText(content, -(80 + j) * i, (50 + i) * j);
}
}
this.context.restore()
this._savePicture(width , height, cb)
}
/* 生成图片 */
_savePicture(width , height, cb){
wx.canvasToTempFilePath({
x:0,
y:0,
width,
height,
destWidth:width*1,
destHeight:height*1,
canvas:this.node,
success:function(res){
cb && cb(res.tempFilePath)
}
})
}
}
/**
*
* @param {*} options 配置项
*/
function makeWatermark(options){
if(!wx) return null
return new MarkwaterMark(options)
}
module.exports = makeWatermark
demo.wxml
<view>
<image src="{{url}}" mode="widthFix"></image>
<canvas
type="2d"
id="waterMark"
/>
</view>
demo.wxss
onLoad(data) {
// /* 创建一个 makeWatermark 对象 */
const marker = makeWatermark({
'id': 'waterMark', /* canvas id */
'content': '我不是外星人', /* 水印内容 */
'rotate': -45, /* 水印文案旋转角度*/
'bg': '#fff', /* 图片背景颜色 */
'color': '#ccc', /* 水印文字颜色 */
})
/* 调用make,生成图片 */
marker.make((url)=>{
/* url 为临时路径 */
const fileManage = wx.getFileSystemManager()
let base64 = 'data:image/jpg;base64,' + fileManage.readFileSync(url,'base64');
console.log('base64');
this.setData({ url: base64 })
})
},

浙公网安备 33010602011771号