需求:根據當前網頁中的幾張圖片,在手機上長按,保存圖片到相冊或者發送給好友。
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);
};
});
};