首页 > 其他分享 >新增水印

新增水印

时间:2023-11-30 13:46:48浏览次数:27  
标签:canvas const img ctx 新增 水印 lineNum let

   //生成水印文字
        createWmWord() {
            console.log(this.curPosiInfo);
            let time = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss');//拍摄时间
            let posi = this.curPosiInfo.address ? this.curPosiInfo.address : '-'
            let lon = '经度:' + (this.curPosiInfo.lon ? this.curPosiInfo.lon : '-');
            let lat = '纬度:' + (this.curPosiInfo.lat ? this.curPosiInfo.lat : '-');
            return {
                shootTime: '拍摄时间:' + time,
                shootPosi: '拍摄地点:' + posi,
                gpsCoords: lon + "," + lat
            }
        },
        getImgUrl({
            url = '',
            fillStyle = 'rgba(238, 10, 36, 0.8)',
            content = '',
            cb = null,
        }) {
            const img = new Image()
            img.src = url
            img.crossOrigin = 'anonymous'
            img.onload = function () {
                const canvas = document.createElement('canvas')
                canvas.width = img.width
                canvas.height = img.height
                const ctx = canvas.getContext('2d')
                ctx.drawImage(img, 0, 0)
                let lineHeight = img.height / 15; //每行站1/15的canvas高度
                let wordWidth = img.width / 28; //单个字占1/28的canvas宽度
                ctx.font = wordWidth + 'px Arial'
                ctx.fillStyle = fillStyle
                // 单独绘制水印
                let tempStr = content.shootPosi;
                // let tempStr = '浙江省哈哈哈哈哈浙江省哈哈哈哈哈浙江省哈哈哈哈哈浙江省哈哈哈哈哈浙江省哈哈哈哈哈浙江省哈哈哈哈哈';
                let lineWidth = 0;
                let lastSubStrIndex = 0;
                let initY = img.height - 1.5 * lineHeight; //只预留两行的地址位置
                let lineNum = 1;
                for (let i = 0; i < tempStr.length; i++) {
                    lineWidth += ctx.measureText(tempStr[i]).width;
                    if (lineWidth > canvas.width * 0.85) {
                        ctx.fillText(tempStr.substring(lastSubStrIndex, i), 10, initY);
                        initY += lineHeight;
                        lineWidth = 0;
                        lastSubStrIndex = i;
                        lineNum++
                    }
                    if (i == tempStr.length - 1) {
                        ctx.fillText(tempStr.substring(lastSubStrIndex, i + 1), 10, initY);
                        //当只有一行内容时,在此处补上此行的计数
                        lineNum === 1 ? lineNum++ : lineNum--
                    }
                }
                ctx.fillText(content.shootTime, 10, img.height - ((lineNum + 1.5) * lineHeight), img.width - 10)
                ctx.fillText(content.gpsCoords, 10, img.height - ((lineNum + 0.5) * lineHeight), img.width - 10)
                // 将绘制完成的canvas转换为base64的地址
                const base64Url = canvas.toDataURL()
                // return base64Url
                cb && cb(base64Url)
            }
        },
        base64ToFile(urlData, fileName) {
            const arr = urlData.split(',')
            const mime = arr[0].match(/:(.*?);/)[1]
            const bytes = atob(arr[1]) // 解码base64
            let n = bytes.length
            const ia = new Uint8Array(n)
            while (n--) {
                ia[n] = bytes.charCodeAt(n)
            }
            return new File([ia], fileName, { type: mime })
        },
        beforeRead(file) {


            console.log('qqq')
            this.$toast.loading('处理中');
            return new Promise((resolve) => {
                const fileName = file.name
                const reader = new FileReader()
                reader.readAsDataURL(file)
                reader.onload = () => {
                    this.getImgUrl({
                        url: reader.result,
                        content: this.createWmWord(),
                        cb: (base64) => {
                            const file = this.base64ToFile(base64, fileName)
                            compressAccurately(file, 500).then(res => {
                                resolve(res)
                            }).catch(() => {
                                this.$toast('上传图片失败')
                            })
                        }
                    })
                }
            })

        },
import { compressAccurately } from 'image-conversion' import dayjs from 'dayjs'

标签:canvas,const,img,ctx,新增,水印,lineNum,let
From: https://www.cnblogs.com/yadi001/p/17867092.html

相关文章

  • 夜莺项目发布 v6.4.0 版本,新增全局宏变量功能
    大家好,夜莺项目发布v6.4.0版本,新增全局宏变量功能,本文为大家简要介绍一下相关更新内容。全局宏变量功能像SMTP的配置中密码类型的信息,之前都是以明文的方式在页面展示,夜莺支持全局宏变量之后,可以在变量管理配置一个smtp_password的密码类型的变量,在SMTP配置页面,密码的......
  • 如何在OpenWrt平台新增一个package
    如何在OpenWrt平台新增一个package目录如何在OpenWrt平台新增一个package背景示例用户态模块内核模块用户态模块+内核模块背景OpenWrt的编译框架做得非常好,只需要在固定的目录下,放置通用的Makefile,其编译框架即可正常读取该Makefile,并用指定的toolchains开始编译。自定义的pac......
  • SpringBoot 实现 PDF 添加水印,我有 5 种实现方案
    Part1简介PDF(PortableDocumentFormat,便携式文档格式)是一种流行的文件格式,它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下,我们需要对PDF文件添加水印,以使其更具有辨识度或者保护其版权。本文将介绍如何使用SpringBoot来实现PDF添加水印的方式。1使用Apach......
  • 鲸鸿动能广告联盟走进厦门,与开发者共道商业化新增长
    11月24日,以“聚势增长,合作共赢”为主题的鲸鸿动能广告联盟城市沙龙·厦门站顺利举行,这也是今年鲸鸿动能开发者城市沙龙系列的第二站。从流量运营、产品创新到广告体验,鲸鸿动能团队与开发者真诚分享,一起见证平台的飞速发展,共同探索流量商业化变现的当下和未来。截至目前,已经有600......
  • pageoffice6 版本实现word 文件添加水印
    在很多场景下,Word文档正式发文之前,或者说形成最终文档之前,常常需要往Word文件中添加水印,并且会根据文件类型或内容的不同,需要添加的水印也不一样。添加水印是Word软件里的一个简单功能,直接点击Word工具栏中的水印按钮就可以手动添加,但是在Web项目开发过程中,时常会遇到通过调用程......
  • Windows平台如何实现RTSP流二次编码并添加动态水印后推送RTMP或轻量级RTSP服务
    技术背景我们在对接RTSP播放器相关的技术诉求的时候,遇到这样的需求,客户做特种设备巡检的,需要把摄像头拍到的RTSP流拉下来,然后添加动态水印后,再生成新的RTSPURL,供平台调用。真个流程需要延迟尽可能的低,分辨率要支持到1080p,并需要把添加过动态水印的数据,保存到本地。技术实现在此之......
  • CQ 社区版 V2.6.0 发布 | SQL闪回、权限看板、新增数据源人大金仓等
    HELLO,大家好,又到了CloudQuery社区版发版时间!本次更新版本为v2.6.0,亮点多多,我们直入主题一起来看!本期亮点新增3种数据源支持V2.6.0,新增三种国产数据源支持:人大金仓(forOracle/PG)(8.6.0)、Gbase(3.3.0.2)、神州通用(7.0.8),对这些数据源支持权限管控、数据保护、审计分析等。目前V2.6......
  • Vue + Element UI 实现复制当前行数据功能(复制到新增页面组件值不能更新等问题解决)
    1、需求使用Vue+ElementUI实现在列表的操作栏新增一个复制按钮,复制当前行的数据可以打开新增弹窗后亦可以跳转到新增页面,本文实现为跳转到新增页面。2、实现1)列表页index.vue<el-table><!--其他列--><el-table-columnlabel="操作"width="150"><templateslot-s......
  • Vue + Element UI 实现复制当前行数据功能(复制到新增页面组件值不能更新等问题解决)
    1、需求使用Vue+ElementUI实现在列表的操作栏新增一个复制按钮,复制当前行的数据可以打开新增弹窗后亦可以跳转到新增页面,本文实现为跳转到新增页面。2、实现1)列表页index.vue<el-table><!--其他列--><el-table-columnlabel="操作"width="150"><templateslot-scope=......
  • 一种基于瞎试的svg去水印方法
    今天用某画图软件绘制电路图,结果导出时发现必须要VIP才能去水印,不过可以导出svg图片,鉴于svg可编辑,因此我在其基础上删掉水印代码即可。看了一会发现,水印并不是明文嵌入的,而是作为图像转化为svg,那么有如下思考:导出的svg文件应该是先进行正常图形的绘制,然后绘制水印,因此位......