vue中使用canvas添加各类水印

2023-10-26

vue使用canvas绘制文字水印背景

1、写watermarker.js文件

/**  水印添加方法  */

const setWatermark = (str1, str2) => {
  const id = '1.23452384164.123412415'

  if (document.getElementById(id) !== null) {
    document.body.removeChild(document.getElementById(id))
  }

  const can = document.createElement('canvas')
  // 设置canvas画布大小
  can.width = 150
  can.height = 80

  const cans = can.getContext('2d')
  cans.rotate(-20 * Math.PI / 180) // 水印旋转角度
  cans.font = '15px Vedana'
  cans.fillStyle = '#666666'
  cans.textAlign = 'center'
  cans.textBaseline = 'Middle'
  cans.fillText(str1, can.width / 2, can.height) // 水印在画布的位置x,y轴
  cans.fillText(str2, can.width / 2, can.height + 22)

  const div = document.createElement('div')
  div.id = id
  div.style.pointerEvents = 'none'
  div.style.top = '40px'
  div.style.left = '0px'
  div.style.opacity = '0.15'
  div.style.position = 'fixed'
  div.style.zIndex = '100000'
  div.style.width = document.documentElement.clientWidth + 'px'
  div.style.height = document.documentElement.clientHeight + 'px'
  div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat'
  document.body.appendChild(div)
  return id
}

// 添加水印方法
export const setWaterMark = (str1, str2) => {
  let id = setWatermark(str1, str2)
  if (document.getElementById(id) === null) {
    id = setWatermark(str1, str2)
  }
}

// 移除水印方法
export const removeWatermark = () => {
  const id = '1.23452384164.123412415'
  if (document.getElementById(id) !== null) {
    document.body.removeChild(document.getElementById(id))
  }
}

2、在页面中使用

<template>
  <div>
  </div>
</template>

<script>
import { removeWatermark, setWaterMark } from '../utils/watermaker'

export default {
  name: 'TestWaterMaker',
  mounted () {
    setWaterMark('liergou', '李二狗')
  },
  destroyed () {
    removeWatermark()
  }
}
</script>

<style scoped>

</style>

效果图如下

2、图片添加文字水印

<template>
  <div>
    <input type="file" id="uploadFile" class="clip" accept="image/*" @change="chooseImg">
    <input type="text" placeholder="请输入你要添加的水印文字" class="water-text" v-model="text" @change="conformText()">
    <div>
      <img id="imgsrc" :src="imgsrc" :width="size">
      <img id="imgTextUrl" :src="imgTextUrl" :width="size"><br/>
      下载
      <img id="imgUploadUrl" :src="imgUploadUrl" @click="downLoad()"><br/>
      <div class="conform" @click="confirmImg()">合成图片</div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'TestWaterMaker1',
  data () {
    return {
      imgsrc: '',
      text: '',
      size: 180,
      imgTextUrl: '',
      imgUploadUrl: ''
    }
  },
  methods: {
    // 上传图片
    chooseImg (event) {
      var file = event.target.files[0]
      var reader = new FileReader()
      reader.readAsDataURL(file)
      const _this = this
      reader.onload = function () {
        _this.imgsrc = reader.result
      }
      _this.imgsrc = file
    },
    // 生成水印文字 canvas文字你可以设置为你喜欢的样式
    conformText () {
      var canvas = document.createElement('canvas') // 准备空画布
      var ctx = canvas.getContext('2d')
      ctx.font = '20px Georgia' // canvas字体
      ctx.fillText(this.text, 10, 50)
      var gradient = ctx.createLinearGradient(0, 0, canvas.width, 0)
      gradient.addColorStop('0', 'magenta')
      gradient.addColorStop('0.5', 'blue')
      gradient.addColorStop('1.0', 'red')
      ctx.fillStyle = gradient
      this.imgTextUrl = canvas.toDataURL('image/png')
    },
    // 合成图片
    confirmImg (url) {
      var canvasAll = document.createElement('canvas')
      // const size = 180
      canvasAll.width = this.size
      canvasAll.height = this.size
      var context = canvasAll.getContext('2d')

      // 这是上传图像
      var imgUpload = new Image()
      var img1 = document.getElementById('imgsrc')
      var img2 = document.getElementById('imgTextUrl')
      context.drawImage(img1, 0, 0, img1.width, img1.height)
      // 再次绘制
      context.drawImage(img2, 0, 130, img2.width, img2.height)
      const that = this
      imgUpload.src = url
      that.imgUploadUrl = canvasAll.toDataURL('image/png')
      /* imgUpload.onload = function () {
        // 绘制
        context.drawImage(img1, 0, 0, img1.width, img1.height)
        // 再次绘制
        context.drawImage(img2, 0, 130, img2.width, img2.height)
        // 回调
        that.imgUploadUrl = canvasAll.toDataURL('image/png')
        console.info(that.imgUploadUrl)
      } */
    },
    downLoad () {
      var a = document.createElement('a')
      a.href = this.imgUploadUrl // 将画布内的信息导出为png图片数据
      a.download = '水印图片' // 设定下载名称 如果不设置a.download 浏览器会尝试打开这张图片 而图片会下载失败
      a.click() // 点击触发下载
    }
  }
}
</script>

<style scoped>

</style>

3、图片添加图片水印

例子两张图片叠加在一起

mounted () {
    const img1 = new Image()
    const that = this
    img1.src = 'data:image/png;base64.........'
    img1.onload = function () {
      const img2 = new Image()
      img2.src = 'data:image/png;base64.........'
      img2.onload = function () {
        const can = document.createElement('canvas')
        can.width = 1080
        can.height = 1080
        const cans = can.getContext('2d')
        cans.drawImage(img1, 0, 0, img1.width, img1.height)
        cans.drawImage(img2, 0, 0, img2.width, img2.height)
        that.imgUploadUrl = can.toDataURL('image/png')
      }
    }
  }

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue中使用canvas添加各类水印 的相关文章

  • Arbor Js - 节点 Onclick?

    我在用着arbor js http arborjs org 创建图表 我如何创建一个onclick节点的事件 或者在单击时在某处创建节点链接 Arborjs org 主页的节点在单击时链接到外部页面 我如何复制它 或者使节点在单击时调用 j
  • 如何在画布上所有其他内容后面绘制图像? [复制]

    这个问题在这里已经有答案了 我有一块画布 我想用drawImage在画布上当前内容后面绘制图像 由于画布上已经有内容 我正在使用字面上的画布来创建包含图像的画布 因此我无法真正先绘制图像 所以我无法使用drawImage在我呈现其余内容之前
  • 使用画布仅删除文本而不删除图像

    我正在尝试删除画布元素中的文本 而不丢失Background Image of the Canvas Element 我想我需要保存Imagesrc并把它还给Canvas Element之后clearRect 但我不知道该怎么做 我希望有人
  • 将 visjs 网络导出为 jpeg/png 图像

    我正在研究 Angular vis js Vis js 在画布上工作 用于创建节点和节点之间的链接 有没有办法从 visj s 画布中获取图像 jpeg png 看看这个片段 我想它会对你有所帮助 在 vis 画布下 您将看到一个 PNG
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • 即使光标位于画布之外也会调用 MouseMove 事件

    我不知道我的代码或 WPF 是否有问题 但问题是 我想创建一个小程序 您可以在其中用光标在画布上绘图 我有一个简单的 WPF 窗口
  • 如何清除画布元素中的多边形区域?

    我使用过clearRect函数 但没有看到多边形的等效函数 我天真地尝试过 ctx fillStyle transparent ctx beginPath ctx moveTo 0 0 ctx lineTo 100 50 ctx lineT
  • 从画布保存/转换后文件质量下降的问题

    这是我正在使用的代码 代码位于这篇文章的底部 但这里是链接GitHubGist Noitidart ff addon snippet browseForBadgeThenCreateSaveAnApply js https gist git
  • DrawBitmapMesh 如何在 Android Canvas 中工作

    我想在矩形上绘制位图 我使用以下值 this meshWidth 1 this meshHeight 1 this verts new float 8 this points 0 x float this getWidth 4 this p
  • 如何将多个画布元素放入一个画布元素中?

    我有多个由 JavaScript 创建的画布元素 我的问题是 如何将多个画布元素放入一个画布元素 干得好 JSfiddle http jsfiddle net Allendar UqxCY 它会抓取每个画布并将它们做成 PNG 的 访问缓冲
  • 如何精确缩放已翻译的d3地图

    我有一张已翻译的地图 以使其正确适合画布 我正在尝试实现一种缩放它的方法 它确实有效 但是当您放大时它会远离中心 而不是以鼠标甚至画布为中心 这是我的代码 function map data total views var xy d3 ge
  • Gridview,允许背景画布在视图之外绘制

    我正在开发一个 Android 应用程序 一个小型记事本应用程序 在我的应用程序中 我使用 Gridview 创建 2 X 大小的网格并在每个单元格中 我有一个 LinearLayout 调用 AbstractNote 它的任务是显示每个保
  • 我将 X Y Z 坐标转换为屏幕 X Y 坐标有什么问题吗?

    我正在制作 3D 空间中弹跳的球体的 HTML5 Canvas 演示 这非常简单 每个球都有 X Y 和 Z 坐标 然后 这些坐标将转换为我在此处阅读的屏幕 X 和 Y 坐标 http answers google com answers
  • 限制线的长度

    我正在尝试画一条代表 弹弓 的线 并且希望它具有最大拉伸长度 在 p5 中 我在位置和位置之间画了一条线 line posA x posA y posB x posB y posA 是鼠标 x 和 y posB 是画布上圆的位置 我想要做的
  • 垂直翻转 Android Canvas

    有没有一种简单的方法可以在 Android 中翻转画布 我似乎找不到任何可以让我垂直翻转它的东西 这样 y 轴上的零就是手机屏幕的底部而不是顶部 如果解决方案不是特别快也没关系 因为我没有对画布进行任何计算密集的操作 提前致谢 Try ca
  • 画布图像遮罩/重叠

    在我的项目中 我必须使用画布在另一个相同尺寸和图案图像上实现一个不同的颜色图像 并且图像不是圆形或矩形形状 所有这些都是波浪形状的 它将应用于单个主背景图像 以便在每个主背景图像上显示多个图形onclick功能 重叠的图像应更改为另一种选定
  • Javascript 像素操作:这些不是我的颜色

    我知道类似的问题已经被问过好几次了 但我还没有找到我想要的东西 我正在将图像读入画布对象 在 JavaScript 中 并尝试操作一些特定的像素 例如 我正在寻找颜色 RGB 224 64 102 并尝试将其更改为其他颜色 我可以将灰度应用
  • 找出在 html5 Canvas 上单击了哪个对象

    假设我有一个 html5 canvas 应用程序 可以在其中将对象放置在绘图画布上 某种图表编辑器 例如 Visio 但更简单 是否有一个框架可以帮助我找到单击 拖动的对象 一个选项是捕获单击事件并迭代我的所有对象 以半智能方式 并检查它是
  • 窗口调整大小事件上的响应式画布

    我是画布概念的新手 我正在尝试使用 D3 js 绘制画布 我想让画布根据窗口屏幕大小进行响应 function onResize var element document getElementsByTagName canvas 0 var
  • 如何计算android中位图擦除区域的百分比?

    我是安卓新手 我正在制作一个可以使用手指擦除画布上的位图的应用程序 像手指画橡皮擦之类的东西 我想计算擦除区域的百分比 例如 60 已从完整图像中擦除 请帮助我做到这一点 提前致谢 我尝试了一些方法 它总是给我 0 它不起作用 请参阅该方法

随机推荐

  • C++中实参形参传递、返回值产生的临时变量

    C 中实参形参传递 返回值产生的临时变量 C和C 中的副本机制 1 函数返回值产生的临时变量 2 实参形参传递过程中产生的临时变量 C和C 中的副本机制 函数的形参 return 都有副本机制 数组没有副本机制 为了节约内存 副本机制就会产
  • Java - XPath解析爬取内容

    maven依赖
  • npm install报错的几种解决办法

    1 可能是缓存问题 vscode新导入项目 使用npm i 安装包时 经常出现npm ERR code EINTEGRITY的问题 应该是npm本地的缓存造成的 1 删除package lock json文件 如果不想更改此文件 装完之后还
  • git问题error: remote origin already exists.

    1 先删除远程 Git 仓库 git remote rm origin 2 再添加远程 Git 仓库 git remote add origin https gitee com xx xxxx git 3 最后git push origin
  • Linux终端Tab提示忽略大小写

    1 在用户家目录下创建 inputrc 文件 touch inputrc 2 在该文件中输入以下内容 set completion ignore case on vi inputrc 输入set completion ignore case
  • 各种杂志投稿方式与评价

    导读 一 目录 1计算机应用研究 2 现代通信 3 火力与指挥控制 4系统仿真学报 5 宇航学报 6导弹与航天运载技术 7小型微型计算机系统 8计算机仿真 9自动化学报 10微计算机信息 11继电器 12电网技术 13传感器技术 14西北农
  • mybatis在insert时,实体类字段为null时,报错问题

    mybatis在insert时 实体类字段为null时 报错问题 在执行SQL时MyBatis会自动通过对象中的属性给SQL中参数赋值 它会自动将Java类型转换成数据库的类型 而一旦传入的是null它就无法准确判断这个类型应该是什么 就有
  • python基础5——正则、数据库操作

    文章目录 一 数据库编程 1 1 connect 函数 1 2 命令参数 1 3 常用语句 二 正则表达式 2 1 匹配方式 2 2 字符匹配 2 3 数量匹配 2 4 边界匹配 2 5 分组匹配 2 6 贪婪模式 非贪婪模式 2 7 标志
  • 【狂神】MySQl - 修改和删除数据库表字段

    1 修改和删除数据库表字段 测试表 CREATE TABLE teacher id INT 11 NOT NULL COMMENT 教师编号 name VARCHAR 100 NOT NULL COMMENT 教师名称 PRIMARY KE
  • DNA repair 【HDU - 2457】【AC自动机+DP思路】

    题目链接 开始肝这道题的时候也是冒了十足的勇气 呜呜呜 当时一直没发现 我有个地方写成了 s i A 怎么能这样用啊 毕竟只有A C G T的说 呜呜呜 QAQ 然后讲一下 这道题的AC自动机的想法 还有DP的思路 我DP超菜 能过也是超神
  • Filezila的下载、安装与使用

    目录 一 Filezila的作用 二 Filezila的下载与安装 三 Filezila的使用 一 Filezila的作用 实现两个不同的主机之间的文件传输 二 Filezila的下载与安装 官网 下载 FileZilla中文网 选择下载客
  • 《为何爱会伤人》-读书笔记

    童年的重复 恋爱是童年关系的一次轮回 轮回的含义有两层 1 重温童年的美好 2 修正童年的错误 修正童年的错误 会让我们有改造的梦想 即想要在恋爱关系中去改造一个人 但是没有人愿意被改造 我们总是忍不住重复童年 哪怕它伤痕累累 一见钟情是我
  • KVM切换器和VGA切换器的区别

    CYK旗舰店接到过很多顾客的咨询 就是关于一个显示器接多个主机 一个主机接多个显示器需要如何连接的 市面上有KVM切换器和VGA切换器 可以解决以上两种问题 但是价格都高于于CYK生产的VGA一分二分屏线 CYK一分二分屏线价格不高 可以满
  • OpenCV教程——图像模糊。均值模糊,高斯模糊,中值模糊,双边模糊,高斯分布

    1 图像模糊 图像模糊是图像处理中最简单和常用的操作之一 使用该操作的原因之一是为了给图像预处理时降低噪声 图像模糊操作背后是数学的卷积计算 卷积操作的原理 常用的图像模糊的方法 均值模糊 高斯模糊 中值模糊 双边模糊 这四种模糊方式有时也
  • latex放一张大图在作者和正文之间

    ACM提供的latex的模板 begin teaserfigure includegraphics width textwidth sampleteaser caption Seattle Mariners at Spring Traini
  • 三.树莓派4B-无线登录

    无线登录 无线登录是指通过树莓派的SSH服务连接树莓派 这种方式最常用 SSH服务开启后 就相当于串口登录时配置config txt和cmdline txt文件一样 使得系统数据往wifi模块进行发送 再由软件接收 呈现系统终端界面 SSH
  • 如何使用Anaconda创建python3.9环境

    如何使用Anaconda创建python3 9环境 首先查看python版本 然后退出 你可以输入conda h查看基本的语法 下面进行创建仓库 即输入conda create 创建一个新的环境要给它一个名字 你可以用 n 表示你后面要起的
  • 微信小程序发布上线全流程(注册/开发/上传审核)

    以下是微信小程序发布上线的详细流程 确认小程序信息 在微信公众平台注册并登录后 进入小程序管理后台 在 开发 gt 开发设置 中填写小程序基本信息和配置 包括小程序名称 图标设计 类目选择等 此外 需要在小程序管理后台中配置小程序服务类目和
  • c++如何求任意多边形的面积

    由于项目需要 求解任意不规则多边形的面积 想了很久 也不知道怎么叙述 直接代码展示吧 include
  • vue中使用canvas添加各类水印

    vue使用canvas绘制文字水印背景 1 写watermarker js文件 水印添加方法 const setWatermark str1 str2 gt const id 1 23452384164 123412415 if docum