vue通过element-image组件实现旋转后保存图片

初级小菜鸟记录一下遇到的问题,这周遇到一个需求,将用户在APP端上传的图片,在后台管理系统可以进行旋转操作后覆盖原图保存,是因为用户拍照上传的角度有的受手机影响,有的也只管拍了传上来就行,造成后续对图片处理存在问题

一开始就只有这样一个上传图片功能,也没有预览功能;

 去element找了一下发现image组件可以对图片进行预览,还可以旋转,心想这不是就成了吗? 

 于是乎赶紧加上去,这时候问题来了,旋转了我怎么保存呢?

查了一下,可以这样,通过操作节点去增加一个保存按钮

<el-image
  :preview-src-list="
    form.material.map((i) =>form.material[5].path + `?n=${new Date().getMilliseconds()}`)
  "
  v-if="form.material[5].path"
  :src="form.material[5].path + `?n=${new Date().getMilliseconds()}`"
  class="avatar"
  @click="clickImage(5)"
/>
// 预览 添加按钮
clickImage(idx) {
    this.num = idx;
    this.$nextTick(() => {
    let wrapper = document.getElementsByClassName(
        "el-image-viewer__actions__inner"
      );
    let downImg = document.createElement("i");
    downImg.setAttribute("class", "el-icon-check");
    wrapper[0].appendChild(downImg);
    if (wrapper.length > 0) {
        this.wrapperElem = wrapper[0];
        this.cusClickHandler();
      }
    });
  },

保存按钮有了, 然后就是拿到旋转后的图片保存即可!~

怎么拿到呢?因为旋转只是改了图片的样式从而展示出来,并未改到真正的图片,这个时候查到可以通过html2canvas插件通过canvas绘制图片后下载图片,于是有了下面这段代码

    // 给按钮添加点击事件
    cusClickHandler() {
      this.wrapperElem.addEventListener("click", this.hideCusBtn);
    },
    // 点击事件
    hideCusBtn(e) {
      let className = e.target.className;
      if (className === "el-icon-check") {
        let imgUrl = document.getElementsByClassName(
          "el-image-viewer__canvas"
        )[0].children[0].src;
        this.downloadImage();
      }
      if (className === "el-icon-refresh-right" || "el-icon-refresh-left") {
        var element = document.getElementsByClassName("el-image-viewer__img");
        html2canvas(element[0]).then((canvas) => {
          this.imgUrl = canvas.toDataURL("image/png");
            //base64格式的图片
        });
      }
    },
    downloadImage() {
      let aLink = document.createElement("a");
      let evt = document.createEvent("HTMLEvents");
      evt.initEvent("click", true, true);
      aLink.download = "test.jpg";
      aLink.href = URL.createObjectURL(blob);
      aLink.click();
    },

这样一通操作下来,图片是能下载了,但下载的是空白图片……降低html2canvas插件的版本试了也不行,这时候给后端说了一下这个问题于是他说他来处理图片旋转问题,我只负责传参就行,瞬间如释重负

参数是图片链接+旋转角度

通过找到图片节点的style的transform属性,通过字符串截取拿到旋转的角度发给后端

if (className === "el-icon-refresh-right" || "el-icon-refresh-left") {
   var imgUrl = this.form.material[this.num].path;
   var element = document.getElementsByClassName("el-image-viewer__img");
   var degA = element[0].style.transform.substring(16);
   var deg = degA.substring(0, degA.length - 4);
 }

后端直接将图片旋转,图片url未变,此时存在图片更新问题,刷新后图片也未改变,由于浏览器有缓存机制, 试了下清除缓存才会更新,所以给图片路径加了一个随机数,让浏览器以为这是不同的资源从而加载最新内容

<el-image
   :preview-src-list="
   form.material.map((i) =>form.material[5].path + `?n=${new Date().getMilliseconds()}`) "
   v-if="form.material[5].path"
   :src="form.material[5].path + `?n=${new Date().getMilliseconds()}`"
   class="avatar"
   @click="clickImage(5)"
/>

 这个时候已经处理得差不多了,还有点小bug,旋转后预览图片会记录之前的角度总之就是显示有问题,如图

所以直接干脆的把遮罩干掉:

 let close = document.querySelector(".el-icon-circle-close");
 close.click();

 最后大功告成~!撒花~~~

贴个小图感受一下

完整代码:

// 预览 添加按钮
clickImage(idx) {
     this.num = idx;
      this.$nextTick(() => {
        let wrapper = document.getElementsByClassName(
          "el-image-viewer__actions__inner"
        );
        let downImg = document.createElement("i");
        downImg.setAttribute("class", "el-icon-check");
        wrapper[0].appendChild(downImg);
        if (wrapper.length > 0) {
          this.wrapperElem = wrapper[0];
          this.cusClickHandler();
        }
      });
    },
// 给按钮添加点击事件
cusClickHandler() {
     this.wrapperElem.addEventListener("click", this.hideCusBtn);
  },
    // 点击事件
 hideCusBtn(e) {
     let className = e.target.className;
      // 旋转照片
     if (className === "el-icon-refresh-right" || "el-icon-refresh-left") {
      // console.log(this.num);
      var imgUrl = this.form.material[this.num].path;
      var element = document.getElementsByClassName("el-image-viewer__img");
      var degA = element[0].style.transform.substring(16);
      var deg = degA.substring(0, degA.length - 4);
      }
    // 确认修改
  if (className === "el-icon-check") {
      // 请求后台旋转图片
      rotate({ url: imgUrl, degrees: deg }).then((res) => {
        if (res.code == 1) {
          this.$message({
            type: "success",
            message: res.msg ? res.msg : "修改成功",
          });
        } else {
          this.$message({
            type: "error",
            message: res.msg ? res.msg : "失败",
          });
        }
      });
      let close = document.querySelector(".el-icon-circle-close");
      close.click();
      studentDetail(this.stuid.bm_id).then((res) => {
        this.form.material = res.data.material;
      });
    }
  },

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好,关于您的问题,可以通过以下步骤实现图片预览: 1. 首先,需要安装并引入 element-ui 组件库和 vue-preview 插件。 2. 在需要实现图片预览的页面中,使用 <el-upload> 组件上传图片,并设置相关属性,如 action、before-upload、list-type 等。 3. 在 <el-upload> 组件的 slot 属性中添加自定义内容,这里可以使用 vue-preview 插件来实现图片预览。具体实现方法如下: ``` <el-upload action="your_upload_url" :before-upload="checkImage" list-type="picture-card"> <i slot="default" class="el-icon-plus"></i> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> // 添加自定义内容 <vue-preview :slides="slides"></vue-preview> </el-upload> ``` 4. 在 data 中定义 slides 数组,并在 checkImage 方法中动态生成 slides 数组的内容,用于传递给 vue-preview 组件进行图片预览。具体实现方法如下: ``` data() { return { slides: [] } }, methods: { checkImage(file) { const isJPG = file.type === 'image/jpeg' || file.type === 'image/png'; const isLt2M = file.size / 1024 / 1024 < 2; if (!isJPG || !isLt2M) { this.$message.error('上传图片只能是 JPG/PNG 格式,且不超过 2MB'); return false; } // 生成 slides 数组,并使用 vue-preview 进行图片预览 const reader = new FileReader(); reader.readAsDataURL(file.raw); reader.onload = () => { this.slides.push({ src: reader.result }); this.$nextTick(() => { this.$refs.preview.open(); }); }; } } ``` 以上就是使用 vue 结合 element-ui 实现图片预览的方法了,希望能对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值