uni-app+uview组件上传图片时添加水印并保存到相册,具体样式需自己调整

<template>
  <view>
    <u-upload :fileList="fileList" @afterRead="afterRead" @delete="deletePic" :maxCount="maxCount"
      :previewFullImage="true" @oversize="oversize($event)" multiple :maxSize="15728640">
    </u-upload>
    <!-- 添加水印虚拟结点 -->
    <!-- <view style="width: 0px; height: 0px; overflow: hidden">
      <canvas :style="'width: '+canvasWidth+'px; height:'+canvasHeight+'px;left:8888px'" canvas-id="myCanvas"></canvas>
    </view> -->
  </view>
</template>

<script>
  import getCurrentLngAndLat from "@/utils/getAddressLocation.js"
  import {
    HTTP_URL,
    HTTP_TEST_URL,
    HTTP_DEV_URL
  } from '@/const/host'
  export default {
    name: "UploadComponent",
    props: {
      maxCount: {
        type: Number,
        default: 1
      },
      name: {
        type: String,
        required: true
      },
      editUrl: {
        type: Array,
        default: () => {
          []
        }
      },
      types: {
        type: String,
        default: 'electronic'
      },
    },
    data() {
      return {
        fileList: [],
        src: '',
        canvasWidth: 0,
        canvasHeight: 0,
        address: '',
        lng: null,
        lat: null
      };
    },
    mounted() {
      // 判断是否存在编辑 URL
      if (this.editUrl) {
        // 将编辑 URL 添加到 fileList 中
        if (this.editUrl[0]?.url === '' || this.editUrl[0]?.url === null) {
          this.fileList = []
        } else {
          this.fileList = this.editUrl
        }
      };
    },
    watch: {
      editUrl: {
        immediate: true,
        handler(newVal, oldVal) {
          if (this.editUrl[0]?.url === '' || this.editUrl[0]?.url === null) {
            this.fileList = []
          } else {
            this.fileList = this.editUrl
          }
        }
      }
    },
    methods: {
      deletePic(event) {
        this.fileList.splice(event.index, 1);
        this.$emit("filesSelected", {
          name: this.name,
          fileList: this.fileList
        });
      },
      oversize(event) {
        uni.$showMsg('图片大小超过最大限制', 'none')
      },
      async afterRead(event) {
        const lists = [].concat(event.file);
        const fileListLen = this.fileList.length;
        for (let i = 0; i < lists.length; i++) {
          const item = lists[i]
          const results = await this.getCurrentLngAndLats();//获取当前定位
           let waterUrl = await this.addWatermark(item.url, address);
          this.fileList.push({
            ...item,
            status: "uploading",
            message: "上传中"
          });
          this.$emit("changLoad", true);
          try {
            const result = await this.uploadFilePromise(waterUrl,results); //上传图片
            await this.saveImage(result); //保存图片
            const uploadedItem = Object.assign({}, item, {
              status: "success",
              message: "",
              url: result
            });
            this.fileList.splice(fileListLen + i, 1, uploadedItem);
            this.$emit("changLoad", false);
          } catch (error) {
            const failedItem = Object.assign({}, item, {
              status: "fail",
              message: "上传失败"
            });
            this.fileList.splice(fileListLen + i, 1, failedItem);
          }
        }
        this.$emit("filesSelected", {
          name: this.name,
          fileList: this.fileList
        });
      },
      uploadFilePromise(url,lngLat) {
        console.log(lngLat,'000')
        // 初始化请求配置项
        let host = "";
        let envVs = uni.getAccountInfoSync().miniProgram.envVersion;
        if (envVs === 'release') {
          host = uni.getStorageSync('normal_url')
        } else if (envVs === 'trial') {
          host = uni.getStorageSync('exp_url')
        } else if (envVs === 'develop') {
          host = uni.getStorageSync('test_url')
        }
        // if (envVs === "release") {
        //   host = HTTP_URL;
        // } else if (envVs === "trial") {
        //   host = HTTP_TEST_URL;
        // } else if (envVs === "develop") {
        //   host = HTTP_DEV_URL;
        // }
        return new Promise((resolve, reject) => {
          // wx.compressImage({
          //   src: url,
          //   quality: 90, // 压缩质量,范围为 0 - 100
          //   success(res) {
          // const compressedFilePath = res.tempFilePath;
          uni.uploadFile({
            url: host + '/api/saler/v1/hhh', // 仅为示例,非真实的接口地址
            filePath: url,
            name: 'file',
            formData: {
              type: this.types,
              lat: lngLat.lat,
              lng: lngLat.lng,
            },
            header: {
              Authorization: 'Bearer ' + uni.getStorageSync('token')
            },
            success: async (res) => {
              if (res.statusCode === 200) {
                let arr = JSON.parse(res?.data);
                if (arr?.code == 0) {
                  uni.$showMsg('上传失败', 'none');
                  resolve('');
                } else {
                  resolve(arr.data?.url);
                }
              } else {
                uni.$showMsg('上传失败', 'none');
                resolve('');
              }
            }
          })
          //     },
          //     fail(err) {
          //       console.error('图片压缩失败:', err);
          //     }
          //   })
        });
      },
      //添加水印
      async addWatermark(img, address) {
        const image = img;
        let res1 = await new Promise((resolve, reject) => {
          uni.getImageInfo({
            src: img,
            success: (res) => {
              // 设置canvas宽高等于原图片宽高
              this.canvasWidth = res.width;
              console.log(Math.floor(res.width * 0.4), 'Math.floor(res.width*0.4)')
              this.canvasHeight = res.height;
              // 创建 canvas 的绘图上下文
              const ctx = uni.createCanvasContext('myCanvas', this);
              // 绘制图片
              ctx.drawImage(image, 0, 0, this.canvasWidth, this.canvasHeight);
              // 设置水印颜色大小
              ctx.setFillStyle('pink');
              ctx.setFontSize(Math.floor(res.width * 0.05));
              // 水印文字
              let time = new Date().toLocaleString();
              // 绘制水印文字
              ctx.fillText(time, 10, res.height * 0.75);
              // ctx.fillText(address, 10, res.height * 0.7);
              this.drawWatermark(ctx, '哈哈哈红红火火恍恍惚惚红红火火恍恍惚惚红红火火恍恍惚惚哈哈哈哈', 10, res.height * 0.85, res.width *
                0.8)
              // 画到 canvas 中
              ctx.draw(false, () => {
                // 将画布转化为图片
                uni.canvasToTempFilePath({
                  canvasId: 'myCanvas',
                  success: (res) => {
                    resolve(res.tempFilePath);
                  },
                  fail: (err) => {
                    reject(err);
                  }
                }, this);
              });
            }
          });
        });
        return (res1);
      },
      // 绘制水印文字
      drawWatermark(ctx, text, x, y, maxWidth) {
        let words = text.split('');
        let line = '';
        for (let n = 0; n < words.length; n++) {
          let testLine = line + words[n] + '';
          let metrics = ctx.measureText(testLine);
          let testWidth = metrics.width;
          if (testWidth > maxWidth && n > 0) {
            ctx.fillText(line, x, y);
            line = words[n] + '';
            y += y * 0.08;
            console.log(y, 'y')
          } else {
            line = testLine;
          }
        }
        ctx.fillText(line, x, y);
      },
      //保存图片
      saveImage(path) {
        uni.downloadFile({ //下载
          url: path,
          success: (res) => {
            uni.saveImageToPhotosAlbum({
              filePath: res.tempFilePath,
              success: () => {
                uni.$showMsg('保存成功', 'none');
              },
              // fail: (err) => {
              //   uni.$showMsg('保存失败', 'none');
              // }
            })
          }
        })
      },
      getCurrentLngAndLats: async () => {
        const res = await getCurrentLngAndLat();
        return res;
      },
    }
  };
</script>

<style scoped>
</style>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值