当前位置:首页 > VUE

vue实现canvas照片水印

2026-01-22 20:24:33VUE

实现思路

在Vue中实现Canvas照片水印,核心是通过Canvas API绘制图片和水印文字,最终导出为新的图片。主要分为加载图片、绘制水印、导出结果三个关键步骤。

基础实现代码

以下是一个完整的Vue组件示例,实现图片上传后添加水印功能:

<template>
  <div>
    <input type="file" @change="handleImageUpload" accept="image/*" />
    <canvas ref="canvas" style="border: 1px solid #ccc;"></canvas>
    <button @click="downloadImage" v-if="hasWatermark">下载图片</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      hasWatermark: false,
      originalImage: null
    }
  },
  methods: {
    handleImageUpload(e) {
      const file = e.target.files[0]
      if (!file) return

      const reader = new FileReader()
      reader.onload = (event) => {
        this.originalImage = new Image()
        this.originalImage.src = event.target.result
        this.originalImage.onload = () => {
          this.drawWatermark()
        }
      }
      reader.readAsDataURL(file)
    },

    drawWatermark() {
      const canvas = this.$refs.canvas
      const ctx = canvas.getContext('2d')

      // 设置canvas尺寸与图片一致
      canvas.width = this.originalImage.width
      canvas.height = this.originalImage.height

      // 绘制原始图片
      ctx.drawImage(this.originalImage, 0, 0)

      // 设置水印样式
      ctx.font = '20px Arial'
      ctx.fillStyle = 'rgba(255, 255, 255, 0.5)'
      ctx.textAlign = 'center'
      ctx.textBaseline = 'middle'

      // 绘制水印文字
      const text = '机密文件'
      const x = canvas.width / 2
      const y = canvas.height / 2
      ctx.fillText(text, x, y)

      this.hasWatermark = true
    },

    downloadImage() {
      const canvas = this.$refs.canvas
      const link = document.createElement('a')
      link.download = 'watermarked-image.png'
      link.href = canvas.toDataURL('image/png')
      link.click()
    }
  }
}
</script>

水印样式优化

水印效果可以通过以下方式增强:

透明度控制

ctx.fillStyle = 'rgba(255, 255, 255, 0.3)' // 最后一个参数控制透明度

多行水印

// 绘制平铺水印
const text = 'Watermark'
const fontSize = 20
ctx.font = `${fontSize}px Arial`
ctx.rotate(-20 * Math.PI / 180) // 倾斜角度

for (let x = 0; x < canvas.width; x += 150) {
  for (let y = 0; y < canvas.height; y += 100) {
    ctx.fillText(text, x, y)
  }
}

性能优化建议

对于大尺寸图片处理,可以考虑以下优化:

使用离屏Canvas

const offscreenCanvas = document.createElement('canvas')
offscreenCanvas.width = this.originalImage.width
offscreenCanvas.height = this.originalImage.height
const offscreenCtx = offscreenCanvas.getContext('2d')
// 在离屏Canvas上完成所有绘制
offscreenCtx.drawImage(this.originalImage, 0, 0)
// ...绘制水印操作
// 最后将结果绘制到可见Canvas
ctx.drawImage(offscreenCanvas, 0, 0)

响应式处理

使Canvas适应不同屏幕尺寸:

// 在drawWatermark方法中添加
const displayWidth = Math.min(this.originalImage.width, window.innerWidth - 40)
const scale = displayWidth / this.originalImage.width
canvas.style.width = `${displayWidth}px`
canvas.style.height = `${this.originalImage.height * scale}px`

注意事项

  • 跨域问题:如果处理来自不同域的图片,需确保服务器配置CORS
  • 移动端兼容性:部分移动设备对Canvas有尺寸限制
  • 图片质量:toDataURL()可指定质量参数,如canvas.toDataURL('image/jpeg', 0.9)

vue实现canvas照片水印

标签: 水印照片
分享给朋友:

相关文章

vue实现水印组件

vue实现水印组件

Vue 水印组件实现 基础水印组件实现 创建一个基础水印组件,通过 props 接收文本、颜色、大小等参数: <template> <div class="watermark-…

vue实现水印

vue实现水印

添加静态水印 在Vue中可以通过CSS或Canvas实现静态水印。CSS方式适合简单文字水印,Canvas适合复杂图形或自定义样式。 CSS方式 通过绝对定位和透明度控制,将水印覆盖在页面上:…

vue 水印 实现

vue 水印 实现

Vue 水印实现方法 使用 Canvas 绘制水印 在 Vue 中可以通过 Canvas 动态生成水印,并将其作为背景或覆盖层添加到页面中。 <template> <div…

vue实现弹照片

vue实现弹照片

Vue 实现图片弹窗展示 安装依赖 确保项目中已安装 Vue.js,若需图片预览组件可安装第三方库如 vue-photo-preview: npm install vue-photo-preview…

vue实现水印组件

vue实现水印组件

Vue 水印组件的实现方法 使用Canvas绘制水印 在Vue组件中通过Canvas动态生成水印图案,将其作为背景添加到目标元素上。 <template> <div ref=…

vue实现pdf水印

vue实现pdf水印

添加PDF水印的实现方法 在Vue中实现PDF水印可以通过以下步骤完成,主要依赖第三方库如pdf-lib或pdf.js。 使用pdf-lib库添加水印 安装pdf-lib库: npm instal…