首页 > 编程语言 >小程序在线图片加水印

小程序在线图片加水印

时间:2023-12-14 18:44:35浏览次数:36  
标签:node 在线 image height width let context 加水 图片

参考: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 })
        })
    },

  

标签:node,在线,image,height,width,let,context,加水,图片
From: https://www.cnblogs.com/guxingzhe/p/17901771.html

相关文章

  • 占位图片(Placeholder Image)
    一、引言在网页设计和开发中,占位图片(PlaceholderImage)是一种常见的技术手段,用于在用户上传图片之前或者图片加载失败时,展示一个临时替代的图片,以提高用户体验。本文将详细介绍占位图片的实现原理和实践应用,并通过实例给出不同场景下的解决方案。占位图片生成器|一个覆盖广......
  • Vue 图片上传formdata()传参形式
    1.接口需要设置 headers:{'Content-Type':'multipart/form-data'}, from-data流的形式传参 2.jshtml://文件上传<divclass="file"><el-buttontype="primary"style="width:170px"icon="el-icon-upload......
  • 第10次-创建一个在线网站
    这个作业属于哪个课程https://edu.cnblogs.com/campus/uzz/cs3这个作业要求在哪里https://edu.cnblogs.com/campus/uzz/cs3/homework/13118这个作业的目标第10次-创建一个在线网站网站链接:https://bluestarc.github.io/introduce.github.io/......
  • 在输入框里直接粘贴图片的实现方式
    有很多Web编辑器支持直接复制粘贴图片,记录一下这种效果是怎么实现的拿到粘贴板上的imagefile对象document.querySelector('textarea').addEventListener('paste',e=>{constfile=Array.from(e.clipboardData.items).find(v=>v.type.includes('image'))......
  • 使用富文本编辑器KindEditor上传图片,一直显示:上传中,请稍后... 的解决办法
    问题详细:在使用KindEditor上传图片时,后端已经接收到了,但前端仍在加载如下图: 解决办法:在配置文件中书写以下代码:X_FRAME_OPTIONS='ALLOWALL' 原因:由于Django配置文件中默认将X_FRAME_OPTIONS配置为了DENY——表示该页面不允许在frame中展示,即便是在相同域名......
  • 第10次-创建一个在线网站
    这个作业属于哪个课程https://edu.cnblogs.com/campus/uzz/cs3/这个作业要求在哪里https://edu.cnblogs.com/campus/uzz/cs3/homework/13118这个作业的目标第10次-创建一个在线网站https://xiamu521.github.io/xiamu.github.io/......
  • 【Python爬虫】Scrapy框架图片下载_桌面壁纸ZOL(纯案例)
    Spider代码classBizhizolSpider(scrapy.Spider):name="bizhizol"allowed_domains=["zol.com.cn"]start_urls=["https://desk.zol.com.cn/youxi/"]defparse(self,response,**kwargs):#print(response.te......
  • 提取图片名称到excel中
    脚本介绍功能这个Python脚本旨在自动化处理一个特定文件夹中的图片文件名,提取每个文件名中的中文字符,并将这些字符保存到一个Excel表格中。它特别适用于那些需要从大量图片文件中提取文本信息以进行进一步分析或记录的情况。使用场景餐饮业:从包含菜品图片的文件夹中提取菜名,......
  • 汽车管理在线查询工具,定位车辆,轻松追踪!
     随着金融科技的不断发展,越来越多的在线查询工具被应用到汽车管理领域。一款名为汽车管理在线查询工具,定位车辆,轻松追踪的工具就是其中之一。此工具通过API接口代码实现了车牌号查车辆信息、车辆故障码、VIN查询汽车品牌以及二手车估值等功能,为用户提供了准确、便捷、高效的汽车......
  • 在线表单有什么特点?可以用在哪些行业?
    随着各行各业行业竞争越来越激烈,很多企业需要找到能提升办公效率的工具来提质增效。传统的表单制作工具虽然有其可取的地方,但是在满足不断激增和复杂化的业务量方面,明显表现得比较吃力。采用低代码在线表单制作工具,可以实现可视化设计,简单又灵活、操作简便又好维护,是不少行业里常......