vue上传图片加水印;js上传图片添加水印;vue给图片添加水印;canvas图片添加水印;canvas画布导出图片

本文介绍了如何在uni-app微信小程序中实现图片上传并添加水印的功能。通过input组件上传图片,获取图片base64数据,利用canvas绘制图片并添加水印文字,最后将带有水印的canvas导出为新的图片。代码适用于非IE9浏览器,提供了一整套实现水印的步骤和示例代码。
摘要由CSDN通过智能技术生成

uni-app微信小程序图片加水印,点击看这篇

需求场景: 要求上传图片,并给图片添加水印。传给后端的也是有水印的图片。

逻辑步骤: 通过input上传图片,拿到图片的信息和base64,将图片绘制到画布上,在画布上添加文字(既水印),最后将画布导出成图片,得到的src就是一张有水印的图片。

文末代码可直接复制使用!!!
在这里插入图片描述

此代码可直接复制使用!!!有效的记得点个赞收藏支持下!

<template>
  <div class="content">
    <input type="file" class="box-orc-input" @change="uploadPic($event)" />
    <div>
      <img class="img_box" :src="imgsrc" alt="">
      <div>原图base:{{imgsrc}}</div>
    </div>
    <div>
      <img class="img_box" :src="img2" alt="">
      <div>水印图base:{{img2}}</div>
    </div>

  </div>
</template>

<script>
function ie9 () {
  if (navigator.appName == "Microsoft Internet Explorer" && navigator.appVersion.split(";")[1].replace(/[ ]/g, "") == "MSIE6.0" || navigator.appName == "Microsoft Internet Explorer" && navigator.appVersion.split(";")[1].replace(/[ ]/g, "") == "MSIE7.0" || navigator.appName == "Microsoft Internet Explorer" && navigator.appVersion.split(";")[1].replace(/[ ]/g, "") == "MSIE8.0" || navigator.appName == "Microsoft Internet Explorer" && navigator.appVersion.split(";")[1].replace(/[ ]/g, "") == "MSIE9.0") {
    return true
  } else {
    return false
  }
}
export default {
  data () {
    return {
      imgsrc: '',//原图片地址
      img2: '',//水印图片地址
    }
  },
  methods: {
    // 通过input上传图片
    uploadPic (event) {
      console.log(event)
      if (event.target.files[0].type != 'image/png' && event.target.files[0].type != 'image/jpg' && event.target.files[0].type != 'image/jpeg') {
        return this.$message.warning('请选择上传图片,格式支持:.png 或 .jpeg 或 .jpeg')
      }
      if (ie9()) {
        this.$message.warning('iE9及以下版本IE浏览器暂不支持该功能,请升级IE浏览器或者用其他浏览器操作。')
        retrun
      }
      //iE9及以下版本IE浏览器暂不支持该功能,请升级IE浏览器或者用其他浏览器操作。
      let inputDOM = event.target
      let _this = this
      var reader = new FileReader()
      reader.readAsDataURL(inputDOM.files[0])
      reader.onload = function (e) {
        _this.imgsrc = e.target.result//这是原图的base

        _this.getImgWay(e)
        inputDOM.value = null //将input置空 否则上传相同文件无反应 (不过置空后 34行的打印 就看不到 event.target.files 文件数据(可以先注释此行看下数据--就是图片文件)   )
      }
    },
    // 根据图片的base获取图片的信息
    getImgWay (e) {
      // console.log(e)
      let _this = this
      // 组装img图片
      var base = e.target.result //图片的base64码,可以直接赋值给img的src
      let res = base.split(',')
      var image = new Image()
      image.src = base //base64数据--赋值

      console.log('原图片信息', image)
      image.onload = function () {
        _this.imgToCanvas(image)
      }
      return false
    },
    // 把image 转换为 canvas对象
    imgToCanvas (image, btn_type, YYZZ) {
      let _this = this
      // 创造画布
      var canvas = document.createElement("canvas")
      canvas.width = image.width
      canvas.height = image.height
      var cxt = canvas.getContext("2d")
      // 将图片绘制上去
      cxt.drawImage(image, 0, 0) // 第一个参数是图片(不能是src 否则会报错,是src的话需要先new Image(),具体看上个getImgWay方法) 第二、三是图片在画布位置 第四、五是将图片绘制成多大宽高(不写四五就是原图宽高)
      // 给画布上添加水印文字
      cxt.font = "20px Georgia"
      cxt.fillText("--水印文字 可自定义--", (image.width - 200), (image.width / 10), 300)
      //将画布导出成图片
      _this.canvasToImg(canvas, btn_type, YYZZ)
      return canvas
    },
    //canvas转换为image
    canvasToImg (canvas) {
      let _this = this
      console.log(4, canvas)
      var src = canvas.toDataURL("image/jpeg")
      console.log('将绘有水印和img的canvas 转成图片获取到src', src)
      _this.img2 = src
      return src
    },
  }
}
</script>

<style>
.img_box {
  /* width: 100px;
  height: 100px; */
}
.content {
  padding: 20upx;
}
.photo,
.photo image {
  display: inline-block;
  width: 220upx;
  height: 220upx;
}
.btnAddPhoto {
  width: 220upx;
  height: 220upx;
  border: dashed 1px #aaa;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 50upx;
}
canvas {
  border: solid 1px gray;
  position: absolute;
  left: 5000upx;
}
</style>


  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在uniapp中使用vue3给照片添加水印,你可以按照以下步骤进行操作: 1. 首先,在你的uniapp项目中创建一个新的组件,命名为`wm-watermark.vue`。 2. 在`wm-watermark.vue`组件中,使用`<template>`标签定义组件的模板,添加一个`<canvas>`元素用于绘制水印。 3. 在`<script>`标签中,导入所需的依赖库,例如`exif-js`用于获取照片的exif信息。 4. 在`<script>`标签中,定义组件的属性和方法。你可以添加一个`text`属性用于设置水印文本,以及一个`drawWatermark`方法用于绘制水印。 5. 在`<script>`标签中,使用`mounted`钩子函数监听组件的挂载事件,在组件挂载后获取照片的exif信息,并调用`drawWatermark`方法绘制水印。 6. 在你需要添加水印的页面中,引入`wm-watermark.vue`组件,并在需要添加水印的位置使用`<wm-watermark>`标签,并设置`text`属性为你想要的水印文本。 下面是一个示例代码: ```vue <template> <canvas ref="canvas"></canvas> </template> <script> import EXIF from 'exif-js'; export default { props: { text: { type: String, default: 'Watermark' } }, mounted() { this.drawWatermark(); }, methods: { drawWatermark() { const canvas = this.$refs.canvas; const ctx = canvas.getContext('2d'); // 绘制水印文本 ctx.font = '20px Arial'; ctx.fillStyle = 'rgba(0, 0, 0, 0.5)'; ctx.fillText(this.text, 10, 50); // 绘制照片 const img = new Image(); img.src = 'path/to/your/photo.jpg'; img.onload = () => { // 获取照片的exif信息 EXIF.getData(img, function() { const orientation = EXIF.getTag(this, 'Orientation'); // 根据照片的exif信息旋转照片 switch (orientation) { case 3: ctx.rotate(Math.PI); ctx.drawImage(img, -canvas.width, -canvas.height, canvas.width, canvas.height); break; case 6: ctx.rotate(Math.PI / 2); ctx.drawImage(img, 0, -canvas.width, canvas.height, canvas.width); break; case 8: ctx.rotate(-Math.PI / 2); ctx.drawImage(img, -canvas.height, 0, canvas.height, canvas.width); break; default: ctx.drawImage(img, 0, 0, canvas.width, canvas.height); break; } }); }; } } } </script> ``` 在你的页面中使用`<wm-watermark>`标签,并设置`text`属性为你想要的水印文本,如下所示: ```vue <template> <view> <wm-watermark text="秦青电子版权所有"></wm-watermark> <!-- 其他内容 --> </view> </template> <script> import wmWatermark from '../../components/wm-watermark.vue'; export default { components: { wmWatermark }, // 其他代码 } </script> ``` 请注意,上述示例代码中的`path/to/your/photo.jpg`需要替换为你实际的照片路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值