vue2+canvs实现图片拼接并下载到本地

vue2+canvs实现图片拼接

主要代码

<img v-if="mergedImage" :src="mergedImage" alt="Merged Image" />
import { saveAs } from 'file-saver'

mergeImages() {
      this.images = [
        'https://**************************',
        'https://**************************',
        'https://**************************',
        'https://**************************',
        'https://**************************'
      ]
      return new Promise((resolve,reject) => {
        let canvas = document.createElement('canvas')
        const ctx = canvas.getContext('2d');
        const imageToLoad = this.images2.map(src => {
          const img = new Image()
          img.src = src
          //设置跨域属性
          img.crossOrigin = 'Anonymous'
          return img
        })

        let loadCount = 0
        //拼接图片的最大宽度
        let maxWidth = 0
        //拼接图片的总高度
        let totalHeight = 0
        imageToLoad.forEach(img => {
          img.onload = () => {
            loadCount++ 
            maxWidth = Math.max(maxWidth,img.width)
            totalHeight += img.height
            if(loadCount == imageToLoad.length){
              canvas.width = maxWidth
              canvas.height = totalHeight
              let currentHeight = 0 
              imageToLoad.forEach(img => {
                ctx.drawImage(img,0,currentHeight)
                currentHeight += img.height
              });
              this.mergedImage = canvas.toDataURL('image/png');
              resolve(this.mergedImage)
              const blob = this.dataURLToBlob(this.mergedImage2);
              saveAs(blob, 'merged-image.png');
            }
          }
        })
      })
    }dataURLToBlob(dataURL) {
      const arr = dataURL.split(',');
      const mime = arr[0].match(/:(.*?);/)[1];
      const bstr = atob(arr[1]);
      let n = bstr.length;
      const u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new Blob([u8arr], { type: mime });
    }

END

以下是使用Vue实现图片拼接成一张图片的示例代码: HTML代码: ```html <div id="app"> <div class="image-container"> <img v-for="image in images" :src="image" :key="image" class="image"> </div> <canvas ref="canvas" class="canvas"></canvas> <button @click="combineImages">合图片</button> </div> ``` CSS代码: ```css .image-container { display: flex; flex-wrap: wrap; } .image { width: 200px; height: 200px; object-fit: cover; margin: 10px; border: 1px solid #000; } .canvas { display: none; } ``` Vue代码: ```javascript new Vue({ el: '#app', data: { images: [ 'path/to/image1.jpg', 'path/to/image2.jpg', 'path/to/image3.jpg' ], canvasWidth: 600, canvasHeight: 600 }, methods: { combineImages() { const canvas = this.$refs.canvas; canvas.width = this.canvasWidth; canvas.height = this.canvasHeight; const ctx = canvas.getContext('2d'); let x = 0; let y = 0; for (let i = 0; i < this.images.length; i++) { const img = new Image(); img.src = this.images[i]; img.onload = function() { ctx.drawImage(img, x, y, canvas.width / 3, canvas.height / 3); x += canvas.width / 3; if (i % 3 === 2) { x = 0; y += canvas.height / 3; } if (i === this.images.length - 1) { const link = document.createElement('a'); link.download = 'combinedImage.png'; link.href = canvas.toDataURL('image/png'); link.click(); } }.bind(this); } } } }); ``` 在上面的示例代码中,我们首先定义了一个包含多个图片的容器,使用Vue的v-for指令动态渲染了每个图片。然后我们定义了一个canvas元素和一个按钮,用于合所有图片。在Vue代码中,我们定义了一个combineImages方法,用于将所有图片拼接成一张图片下载。在该方法中,我们首先获取canvas元素和其上下文对象,设置canvas的宽度和高度。然后我们使用for循环遍历所有图片在每个图片加载完成后使用drawImage方法将其绘制到canvas上。在绘制完成后,我们判断是否已经绘制完所有图片,如果是,则创建一个下载链接模拟点击该链接以下载拼接好的图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值