UNPKG

vue-canvas-poster

Version:

A lightweight vue components use canvas draw image by css properties.(一个通过css属性画canvas图片的轻量级的vue组件)

388 lines (386 loc) 12.8 kB
// 海报图 export function drawPoster(data) { return new Promise(function(resolve) { switch (data.type) { case 'pro': resolve(poster(data)) break case 'image': resolve(drawImgPoster(data)) break case 'text': resolve(drawText(data)) break default: resolve(poster(data)) } }) } // demo 微信分享图 function poster() { return { width: '550px', height: '876px', background: '#f4f5f7', views: [ { type: 'image', url: 'https://www.sunniejs.cn/static/avatar.png', css: { top: '20px', left: '36px', borderRadius: '100%', width: '80px', height: '80px', borderWidth: '6px', borderColor: '#fff' } }, { type: 'text', text: '乖摸摸头的小店,我设置了maxLines为1', css: { top: '48px', left: '136px', width: '360px', maxLines: 1, fontSize: '26px', fontWeight: '500' } }, { type: 'rect', css: { top: '120px', left: '12px', color: '#fff', width: '526px', height: '540px', borderRadius: '10px' } }, { type: 'image', url: require('./assets/1.jpg'), css: { top: '150px', left: '25px', width: '332px', height: '332px' } }, { type: 'image', url: 'https://tgoods.top1buyer.com/res/testfile/imgs/20190702180744/MR9600-Pink/2.jpg', css: { top: '150px', left: '364px', width: '160px', height: '160px' } }, { type: 'image', url: 'https://tgoods.top1buyer.com/res/testfile/imgs/20190702180744/MR9600-Pink/3.jpg', css: { top: '320px', left: '364px', width: '160px', height: '160px', } }, { type: 'text', text: '二手精选', css: { top: '507px', left: '27px', fontSize: '22px', color: '#02BE8A', padding: '3px 4px 3px 4px', borderRadius: '2px', background: 'rgba(2,190,138,0.1)' } }, { type: 'text', text: '18987、安奈儿童装上衣条纹童装上衣条纹童装上衣 条纹童装上衣', css: { top: '507px', left: '25px', textIndent: '110px', color: '#666666', fontSize: '22px', width: '460px', lineHeight: '33px', maxLines: 2 } }, { type: 'text', text: '劲爆价:', css: { top: '608px', left: '26px', color: '#666666', fontSize: '24px' } }, { id:'price', type: 'text', text: '¥392.00', css: { top: '601px', left: '116px', color: '#E5463E', fontSize: '36px', fontWeight: 'bold' } }, { type: 'text', text: '¥259.00', css: { top: '609px', left: ['130px', 'price'], color: '#999999', fontSize: '26px', fontWeight: 'bold', textDecoration: 'line-through' } }, { type: 'rect', css: { top: '647px', left: '439px', color: '#fff', width: '28px', height: '28px', rotate: 45 } }, { type: 'text', text: '长按或扫描二维码', css: { fontSize: '18px', color: '#999999', bottom: '22px', left: '385px' } }, // base64 { type: 'image', url: 'data:image/png;base64,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', css: { left: '26px', bottom: '22px', width: '218px', height: '24px' } }, { type: 'qrcode', content: 'https://github.com/sunniejs/vue-canvas-poster', css: { bottom: '50px', right: '26px', color: '#000', width: '130px', height: '130px' } } ] } } // image demo function drawImgPoster() { return { width: '654px', height: '1000px', background: '#eee', views: [ { type: 'image', url: require('./assets/avatar.png') }, { type: 'text', text: '未设置height、width时', css: { left: '270px', top: '60px', fontSize: '30px' } }, { type: 'image', url: require('./assets/avatar.png'), css: { width: '200px', height: 'auto', top: '250px' } }, { type: 'text', text: '设置height为auto', css: { left: '270px', top: '280px', fontSize: '30px' } }, { type: 'image', url: require('./assets/avatar.png'), css: { width: '200px', height: '200px', top: '430px' } }, { type: 'text', text: "mode: 'aspectFill' 或 无", css: { left: '270px', fontSize: '30px', top: '490px' } }, { type: 'image', url: require('./assets/avatar.png'), css: { width: '200px', height: '200px', mode: 'scaleToFill', top: '650px' } }, { type: 'text', text: "mode: 'scaleToFill'", css: { left: '270px', top: '710px', fontSize: '30px' } } ] } } // text demo function drawText() { return { width: '654px', height: '1000px', background: '#eee', views: [ { type: 'text', text: 'overline', css: [ { top: '50px', textDecoration: 'overline', left: '20px', fontSize: '40px' } ] }, { type: 'text', text: 'underline', css: [ { top: '120px', textDecoration: 'underline', left: '20px', fontSize: '40px' } ] }, { type: 'text', text: 'line-through', css: [ { top: '190px', textDecoration: 'line-through', left: '20px', fontSize: '40px' } ] }, { type: 'text', text: 'overline underline line-through', css: [ { top: '260px', color: 'red', textDecoration: 'overline underline line-through', left: '20px', fontSize: '40px' } ] }, { type: 'text', text: "fontWeight: 'bold'", css: [ { top: '330px', fontWeight: 'bold', left: '20px', fontSize: '40px' } ] }, { type: 'text', text: '我是把width设置为300px后,我就换行了', css: [ { top: '400px', width: '400px', left: '20px', fontSize: '40px' } ] }, { type: 'text', text: '我设置了maxLines为1,看看会产生什么效果', css: [ { top: '540px', width: '400px', maxLines: 1, left: '20px', fontSize: '40px' } ] }, { type: 'text', text: "textStyle: 'stroke'", css: [ { top: '610px', textStyle: 'stroke', fontWeight: 'bold', left: '20px', fontSize: '40px' } ] } ] } }