首页 > 其他分享 >签名功能并且加水印

签名功能并且加水印

时间:2024-09-26 21:48:27浏览次数:6  
标签:功能 const img url ossConfig ctx canvas 签名 加水

找的插件,自己写要做一堆兼容麻烦死了

使用的这个插件vue-signature-pad,看下载量很多

npm i vue-signature-pad

 

import { VueSignaturePad } from 'vue-signature-pad';

 components: {
        VueSignaturePad, UseDetailDailog
    },

 <VueSignaturePad
                    class="sign-box"
                    :width="signWidth + 'px'"
                    :height="signHeight + 'px'"
                    ref="signaturePad"
                    :options="options"
                />
  options: {
                backgroundColor: 'rgba(0,0,0,0)',
                penColor: 'rgba(0,0,0,1)',
                velocityFilterWeight: 0.7,
                onBegin: () => { (this.$refs.signaturePad as any).resizeCanvas() }, // 手动初始化
            },

 mounted() {
        this.checked = false;
        const { width, height } = document.getElementById('pad-box')?.getBoundingClientRect() as any;
        this.signWidth = width - 10;
        this.signHeight = height;
        nextTick(() => {
            (this.$refs.signaturePad as any).resizeCanvas();
            this.setSignBg();
            // this.setSignWatermark();
        })
    },

 应为要使用撤销的功能,所以水印是自己做背景做的假货,但是上传的时候需要带上水印,拿到插件给的数据是base64,所以要自己再画一遍加上水印

async setSignWatermark(base64: string) {
            const canvas = document.createElement('canvas') as HTMLCanvasElement;
            const ctx = canvas?.getContext("2d") as CanvasRenderingContext2D;//获取画笔
            canvas.width = this.signWidth;
            canvas.height = this.signHeight;
            canvas.style.display = "none";
            const width = 130;
            const height = 120;
            const numberLine = Math.ceil(this.signWidth / width) + 10;
            const numberHeight = Math.ceil(this.signHeight / height) + 10;
            ctx.font = "16px";
            ctx.fillStyle = "rgba(0,0,0,.3)";
            ctx.save();
            ctx.rotate(-0.4);
            for (let i = -10, l = numberLine; i < l; i++) {
                for (let j = -10, h = numberHeight; j < h; j++) {
                    ctx.fillText("eefit会员项目使用凭证", (200 / 6) + (i * width), (160 / 2) + (j * height));
                    ctx.translate(5, 0);
                }
            };
            ctx.restore();
            const img = await this.createImg(base64);
            ctx.drawImage(img, 0, 0, this.signWidth, this.signHeight);
            return canvas;
        },
      
createImg(url: string): Promise<any> {             return new Promise((resolve, reject) => {                 const img = new Image();                 img.src = url;                 img.onload = () => {                     resolve(img);                 };                 img.onerror = () => {                     reject();                 };             });         },
 

最后一步,校验并提交获取url

        async upSign() {
            try {
                await this.checkedInfo();
                this.loading = true;
                const { data } = (this.$refs.signaturePad as any).saveSignature();
                const canvas = await this.setSignWatermark(data);
                const dataURL = canvas.toDataURL('image/png');
                this.ossConfig = await commonService.getOssConfig();
                this.client = new OSS({
                    accessKeyId: this.ossConfig.access_key_id,
                    accessKeySecret: this.ossConfig.access_key_secret,
                    region: this.ossConfig.region,
                    bucket: this.ossConfig.bucket,
                });
                let fileName = `${new Date().getTime()}${Math.ceil(Math.random() * 1e5)}.png`;
                const file = this.base64ToFile(dataURL, fileName);
                let url = '';
                await this.client.put(`${this.ossConfig.object}/${fileName}`, file, {
                    headers: {
                        'x-oss-security-token': this.ossConfig.security_token,
                    }
                }).then((res: any) => {
                    url = `${this.ossConfig.domain}/${this.ossConfig.object}/${fileName}`;
                }).catch((err: any) => {
                });
                console.log('url->', url);
            } catch (error) {
                ElMessage.error(this.$t('提交签名失败'))
            } finally {
                this.loading = false;
            }
        },
        base64ToFile(base64String: any, fileName: string) {
            const arr = base64String.split(',');
            const mime = arr[0].match(/:(.*?);/)[1];
            const bstr = atob(arr[1]);
            let n = bstr.length;
            const u8arr = new Uint8Array(n);

            while (n--) {
                u8arr[n] = bstr.charCodeAt(n);
            }
            return new File([u8arr], fileName, { type: mime });
        }

搞定,拿到url。

 成功上传。

标签:功能,const,img,url,ossConfig,ctx,canvas,签名,加水
From: https://www.cnblogs.com/lopb/p/18434472

相关文章

  • 教授(优青)团队一站式指导:专业实验设计、数据分析、SCI论文辅助。基因表达分析、转录因
    可高通量检测组蛋白不同修饰在基因组上的位点;可用于模式物种和非模式物种的研究,无需特异性抗体;完整的DAP-seq解决方案。DAP-seq可高通量检测转录因子或DNA结合蛋白在基因组上的结合位点;可用于模式物种和非模式物种的研究,无需特异性抗体;完整的基因功能分析解决方案......
  • vue tsx功能测试,包含v-model 实现,slot实现,数据响应注意点
    child.tsximport{defineComponent}from'vue';//响应式数据需要放在函数外面,或者放在setup里面constdata1=ref(123);functionmyComponent(){constdata2=ref(34);//在这里定义ref无法响应式functiondata2ClickHanlder(){data2.valu......
  • Nexpose 6.6.270 发布下载,新增功能概览
    Nexpose6.6.270forLinux&Windows-漏洞扫描Rapid7VulnerabilityManagement,releaseSep18,2024请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org您的本地漏洞扫描程序新增功能2024年9月18......
  • Unit Converter Pro 全能单位转换器v4.5.0绿色专业版_一款手机多功能单位转换软件
     软件介绍UnitConverterPro全能单位转换器v4.5.0绿色专业版,一款手机多功能单位转换软件在现代的日常生活中,无论我们是在做家务、办公、还是在实验室中做科学实验,经常需要进行单位转换和计算。有时是长度、重量,有时是体积、温度,甚至更复杂的工程单位。为了满足这些需求,......
  • (H5前端CAD)在线CAD如何实现图形识别功能
    前言CAD图形识别功能可帮助用户快速识别和提取CAD图纸中的各种图形,从而加速设计过程。​可应用在识别与分类阶段,自动识别图纸中的不同元素,通过特定特征进行区分,减少了手动分类的工作量;也可应用在数量统计阶段,统计图纸中各种构件的数量用于预算;还可运用在图纸定位和应用阶段,快速定......
  • 遇到stdole.dll强签名无效?Windows用户必看:如何安全处理stdole.dll的强签名验证问题
    遇到stdole.dll强签名无效的问题时,Windows用户需要谨慎处理以确保系统的稳定性和安全性。以下是一些安全处理stdole.dll强签名验证问题的步骤和建议:一、了解stdole.dll首先,了解stdole.dll是一个关键的系统文件,它主要负责OLE(对象链接与嵌入)技术的一些基础功能。在Windows操作......
  • ADB功能简介及常规使用
    ADB(AndroidDebugBridge)是Android系统的一个重要工具,它允许开发者通过电脑控制和管理Android设备,进行软件安装、卸载、运行shell命令、文件传输等多种操作。一、ADB的基本功能设备连接与管理:ADB能够识别并连接已开启调试模式的Android设备,无论是模拟器还是真实设备。通过ADB......
  • 打造同城O2O平台:外卖跑腿APP的架构与功能设计详解
    今天,小编将于大家共同讨论外卖跑腿APP的架构设计及其核心功能,旨在为开发者提供一份详尽的参考。 一、外卖跑腿APP的架构设计1.整体架构概述通常包括前端、后端和数据库。2.前端设计用户端提供直观的界面,方便用户下单、查询订单状态、进行支付等操作;骑手端则需关注接单、导航、订单......
  • python使用win32gui、win32con窗口函数功能及参数意义
    使用python设置窗口显示、最大化、最小化、隐藏的时候,需要win32gui.ShowWindow(hwnd,win32con.SW_HIDE),那么对于的参数如下:ShowWindow函数的参数有:1.hWnd:窗口句柄,用于标识要操作的窗口;2.nCmdShow:指定窗口如何显示,可以是以下值:SW_HIDE:隐藏窗口并**其他窗口。nCmdShow=0。SW_......
  • 4G工业网关的功能特点有哪些?选型与应用-天拓四方
    随着工业4.0时代的到来,数字化转型已成为企业提升竞争力、优化生产效率的必经之路。在这一过程中,4G工业网关凭借其卓越的性能和广泛的适用性,成为了连接工业现场与互联网的重要桥梁,为企业实现远程监控、数据采集、设备控制等功能提供了强有力的支持。一、4G工业网关的基本概念4......