当前位置:首页 > 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>

水印样式优化

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

vue实现canvas照片水印

透明度控制

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

多行水印

vue实现canvas照片水印

// 绘制平铺水印
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实现水印

vue实现水印

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

elementui照片

elementui照片

以下是关于 Element UI 照片(图片)相关组件的整理和用法说明: Element UI 图片相关组件 el-image 用于展示图片,支持懒加载、占位图、图片预览等功能。 基础用法:&…

vue页面实现水印

vue页面实现水印

实现Vue页面水印的方法 使用CSS背景图实现水印 在Vue组件中通过CSS添加重复水印背景,适合静态水印。 <template> <div class="watermark…

vue怎么实现页面水印

vue怎么实现页面水印

实现页面水印的方法 在Vue中实现页面水印可以通过以下几种方式完成,根据需求选择合适的方法。 使用Canvas生成水印 通过Canvas绘制水印文本或图片,并将其作为背景插入到页面中。 //…

vue怎么实现全景照片

vue怎么实现全景照片

Vue 实现全景照片的方法 使用 Three.js 库 Three.js 是一个强大的 3D 库,可以用于创建全景照片效果。通过 Vue 集成 Three.js,可以实现 360 度全景展示。 安…

vue实现背景轮转照片

vue实现背景轮转照片

Vue实现背景轮转照片的方法 使用Vue实现背景轮转照片可以通过动态绑定样式和定时器来实现。以下是一种常见的实现方式。 创建Vue组件 在Vue组件中,定义照片数组和当前显示的索引。通过v-bin…