canvas合併兩張圖片--前端

需求:根據當前網頁中的幾張圖片,在手機上長按,保存圖片到相冊或者發送給好友。

1. Canvas合成圖片

drawCanvas(){
    var self = this;
    var imgsrcArray = [
        require('@/page/agent/agentexpand/img/bg.jpg'),
        'data:image/jpeg;base64,'+this.codeUrl
    ];
    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d');
    canvas.width = 750;
    canvas.height = 1333;
    var imglen = imgsrcArray.length;
    var drawimg = (function f(n){
        if(n < imglen){
            var img = new Image();
            img.crossOrigin = 'Anonymous'; //解決跨域問題
            img.onload = function(){
                //ctx.save();
                if(n == 0){
                    ctx.drawImage(img,0,0,750,1333);
                }else{
                    ctx.drawImage(img,466,574,210,210);
                }
                f(n+1);
            } 
            img.src = imgsrcArray[n];
        }else{
            self.downloadUrl = canvas.toDataURL("image/jpeg");
            self.downloadUrl = self.downloadUrl.replace("data:image/jpeg;base64,", "");
        }
    })(0);
}

vue語法調用方式:<img :src="'data:image/jpeg;base64,' + downloadUrl"/>

2. Canvas合成圖片

HTML5給我們提供了一個很好的圖像處理神器Canvas,想要合成圖片,我們首先得將圖片按照一定順序、大小和位置一張張繪製到Canvas畫布中去,最後再將整個Canvas導出爲圖片。

// 圖片合成插件
class ImgMerge {
    constructor(imgs = [], options){
        // 圖片數組默認配置項
        let defaultImgsItem = {  url: '',   x: 0,    y: 0   };
        // 導出圖片的格式與壓縮程度默認配置項
        let defaultOpts = {    type: 'image/jpeg',   compress: 1    };

        try {
          imgs.forEach((item,i,arr) => {
            arr[i] = Object.assign({},defaultImgsItem,item)
          }); }catch (e) {    throw '請傳入一個正確的對象數組作爲參數'; }

        this.imgs = imgs;   // 圖片數組配置項
        this.opts = Object.assign({},defaultOpts,options);   // 其他配置項
        this.imgObjs = [];   // 圖片對象數組

        this.createCanvas();  // 創建畫布
        return this.outputImg();  // 導出圖片
    }
    // 創建畫布
    createCanvas(){
        let canvas = document.createElement('canvas'),
            ctx = canvas.getContext('2d');
        let w = this.imgs[0].width,    h = this.imgs[0].height;

        if(!w){  throw '第一張圖片寬度未設置';    }
        if(!h){  throw '第一張圖片高度未設置';	  }
        canvas.width = w;
        canvas.height = h;
        this.ctx = ctx;
    }
    // 繪製圖片
    drawImg(i){
        let img = new Image();
        img.src = this.imgs[i].url;
        this.imgObjs.push(img);
        return new Promise((resolve)=>{  img.onload = resolve;  });
    }
    // 導出圖片
    outputImg(){
        let imgArr = [];
        // 將單張圖片的Promise對象存入數組
        this.imgs.forEach((item,i) => {  imgArr.push(this.drawImg(i));  });

        // 所有圖片加載成功後將圖片繪製於Canvas中,後將Canvas導出爲圖片
        return Promise.all(imgArr).then(()=>{
            this.imgs.forEach((item,i) => {
              let drawPara = [this.imgObjs[i], this.imgs[i].x, this.imgs[i].y];
              // 此處判斷參數中圖片是否設置了寬高,若寬高均設置,則繪製已設置的寬高,否則按照圖片默認寬高繪製
              if(this.imgs[i].width && this.imgs[i].height){
                drawPara.push(this.imgs[i].width, this.imgs[i].height);
              }
              this.ctx.drawImage(...drawPara);
            });
            // 以base64格式導出圖片
            return Promise.resolve(this.ctx.canvas.toDataURL(this.opts.type),this.opts.compress);
        });
    }
}
window.ImgMerge = ImgMerge;   //  可用於全局引用
export default ImgMerge;   //  可用於模塊化引用

使用

import ImgMerge from './imgMerge.js';
window.onload = function () {
    let imgMerge = new ImgMerge([
        {  url: require('../images/bg.jpg'),  width: 640,  height: 1169   },
        {  url: require('../images/1.jpg'),  width: 200,   height: 200    }
    ]);
    imgMerge.then(img => {
      let mergeImg = new Image();
      mergeImg.src = img;
      mergeImg.onload = () => {
        document.body.appendChild(mergeImg);
      };
    });
};

參考1111

參考2222

參考3333

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章