• HTML

<template>
<view class="content">
<view class="flex_row_c_c modalView" :class="qrShow?'show':''" @tap="hideQr()">
<view class="flex_column">
<view class="backgroundColor-white border_radius_10px padding1vh">
<image :src="poster.finalPath" mode="widthFix" class="posterImage"></image>
</view>
<view class="flex_row marginTop2vh">
<button type="primary" size="mini" @tap.prevent.stop="saveImage()">保存图片</button>
<button type="primary" size="mini" @tap.prevent.stop="share()">分享图片</button>
</view>
</view>
</view> <button type="primary" @tap="shareFc()">生成海报</button>
<view class="hideCanvasView">
<canvas class="hideCanvas" canvas-id="default_PosterCanvasId" :style="{width: (poster.width||0) + 'px', height: (poster.height||0) + 'px'}"></canvas>
</view>
</view>
</template>

  • JS

<script>
import _app from '@/util/QS-SharePoster/app.js';
import getSharePoster from '@/util/QS-SharePoster/QS-SharePoster.js';
export default {
data() {
return {
poster: {},
qrShow: false,
canvasId: 'default_PosterCanvasId'
}
},
methods: { async shareFc() {
try {
if (!this.poster.finalPath) {
const d = await getSharePoster({
type: 'testShareType',
posterCanvasId: this.canvasId,
qrCodeArray: ({bgObj, type, bgScale}) => {
return [{
text: 'xiazhenjie',
size: bgObj.width*0.25,
dx: bgObj.width*0.05,
dy: bgObj.height - bgObj.width*0.25 - 50
}]
},
imagesArray: ({bgObj, type, bgScale}) => { //接收的第一个参数为背景图片的信息, 第二个参数是自定义标识(感觉这里用不到), 图片为示例图片
const dx = bgObj.width*0.3;
return [
{
url: '/static/good_image.jpg',
dx:0,
dy: 80,
infoCallBack(imageInfo) {
let scale = bgObj.width*0.2 / imageInfo.height;
return {
dWidth: bgObj.width,
dHeight: bgObj.height*0.4,
}
}
},
{
url: '/static/2.jpg',
dx,
dy: bgObj.height - bgObj.width*0.25 - 50,
infoCallBack(imageInfo) {
let scale = bgObj.width*0.2 / imageInfo.height;
return {
circleSet: {
x: imageInfo.width * scale/2,
y: bgObj.width*0.2/2,
r: bgObj.width*0.2/2
}, // 圆形图片 , 若circleSet与roundRectSet一同设置 优先circleSet设置
dWidth: imageInfo.width * scale, // 因为设置了圆形图片 所以要乘以2
dHeight: bgObj.width*0.2,
roundRectSet: { // 圆角矩形
r: imageInfo.width*0.1
}
}
}
},
]
},
textArray: ({bgObj, type, bgScale}) => {
const fontSize = bgObj.width*0.045;
const lineHeight = bgObj.height*0.04;
return [
{
// fontStyle: 'bold',
text: '【新品】大牌来袭,香港直邮教育是护肤品2件套金和爽肤露',
size: 15,
color: '#333333',
alpha: .5,
textAlign: 'left',
textBaseline: 'middle',
infoCallBack(textLength) {
_app.log('index页面的text的infocallback ,textlength:' + textLength);
return {
dx: 2,
dy: 10
}
}
},
{
text: '200ml温和清洁乳200ml撒娇好多话莪个月 恶客额度金额的',
size: 15,
color: '#333333',
alpha: .5,
textAlign: 'left',
textBaseline: 'middle',
infoCallBack(textLength) {
return {
dx: 2,
dy: 32
}
}
},
{
text: '话后过来的.',
size: 15,
color: '#333333',
alpha: .5,
textAlign: 'left',
textBaseline: 'middle',
infoCallBack(textLength) {
return {
dx: 2,
dy: 54
}
}
},
{
text: '限时特卖 19日21:00开抢',
size: 15,
color: '#333333',
alpha: .5,
textAlign: 'left',
textBaseline: 'middle',
infoCallBack(textLength) {
return {
dx: 120,
dy: 345
}
}
},
{
text: '美美的夏末的店铺',
size: 15,
color: '#333333',
alpha: .5,
textAlign: 'left',
textBaseline: 'middle',
infoCallBack(textLength) {
return {
dx: bgObj.width - 160,
dy: bgObj.height - 130
}
}
},
{
text: '美利',
size: 12,
color: '#333333',
alpha: .5,
textAlign: 'left',
textBaseline: 'middle',
infoCallBack(textLength) {
return {
dx: bgObj.width - 160,
dy: bgObj.height - 110
}
}
},
{
text: '¥219.00',
size: 15,
color: '#333333',
alpha: .5,
textAlign: 'left',
textBaseline: 'middle',
infoCallBack(textLength) {
return {
dx: bgObj.width - 260,
dy: bgObj.height - 50
}
}
},
{
text: '长按图片识别 二维码查看商品详情',
size: 12,
color: '#333333',
alpha: .5,
textAlign: 'left',
textBaseline: 'middle',
infoCallBack(textLength) {
return {
dx: bgObj.width - 260,
dy: bgObj.height - 30
}
}
},
]
},
setCanvasWH: ({bgObj, type, bgScale}) => { // 为动态设置画布宽高的方法,
this.poster = bgObj;
this.poster.height = 600;
},
setDraw: ({Context, bgObj, type, bgScale}) => {
Context.setFillStyle('#F5F4F9');
Context.setGlobalAlpha(0.6);
Context.fillRect(0, bgObj.height - bgObj.height*0.2 - 40, bgObj.width, bgObj.height*0.2 + 30);
}
});
console.log('海报生成成功, 临时路径: ' + d.poster.tempFilePath)
this.poster.finalPath = d.poster.tempFilePath;
}
this.qrShow = true;
} catch (e) {
_app.hideLoading();
_app.showToast(JSON.stringify(e));
console.log(JSON.stringify(e));
}
}, saveImage() {
// #ifndef H5
uni.saveImageToPhotosAlbum({
filePath: this.poster.finalPath,
success(res) {
_app.showToast('保存成功');
}
})
// #endif
// #ifdef H5
_app.showToast('保存了');
// #endif
}, share() {
// #ifdef APP-PLUS
_app.getShare(false, false, 2, '', '', '', this.poster.finalPath, false, false);
// #endif // #ifndef APP-PLUS
_app.showToast('分享了');
// #endif
}, hideQr() {
this.qrShow = false;
} }
}
</script>

  • CSS

.hideCanvasView {
position: relative;
} .hideCanvas {
position: fixed;
top: -99999upx;
left: -99999upx;
z-index: -99999;
} .flex_row_c_c {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
} .modalView {
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
opacity: 0;
outline: 0;
transform: scale(3);
perspective: 2500upx;
background: rgba(0, 0, 0, 0.6);
transition: all .3s ease-in-out;
pointer-events: none;
backface-visibility: hidden;
z-index: 999;
} .modalView.show {
opacity: 1;
transform: scale(1);
pointer-events: auto;
} .flex_column {
display: flex;
flex-direction: column;
} .backgroundColor-white {
background-color: white;
} .border_radius_10px {
border-radius: 10px;
} .padding1vh {
/* padding: 1vh; */
padding-top: 20px;
}
.padding1vh2{
padding-top: 20px;
padding-bottom: 20px;
} .posterImage {
width: 80vw;
height: 40vw;
} .flex_row {
display: flex;
flex-direction: row;
} .marginTop2vh {
margin-top: 2vh;
}

参考:https://ext.dcloud.net.cn/plugin?id=471

项目地址 :https://dev.tencent.com/u/Coding-Neo/p/CanvasPoster/git

Canvas 制作海报的更多相关文章

  1. H5上传图片并使用canvas制作海报

    马上就要"十一"国庆节了,又恰逢公司已经三周岁了,所以市场部和产品共同策划了一个"正青春,共成长"的主题代言活动,准备在国庆节以及中秋节期间让公司员工和用户为公 ...

  2. 用Canvas制作简单的画图工具

    今天用Canvas制作了一个画图工具,非常简单,功能也不是很多,主要有背景网格,画线,画圆,画矩形和画圆角矩形,也用到了canvas的一些基本知识,在这里一一列举. 1.线段的绘制: 如何绘制真正的1 ...

  3. 酷!使用 jQuery & Canvas 制作相机快门效果

    在今天的教程中,我们将使用 HTML5 的 Canvas 元素来创建一个简单的摄影作品集,它显示了一组精选照片与相机快门的效果.此功能会以一个简单的 jQuery 插件形式使用,你可以很容易地整合到任 ...

  4. 如何使用 HTML5 Canvas 制作水波纹效果

    今天,我们继续分享 JavaScript 实现的效果例子,这篇文章会介绍使用 JavaScript 实现水波纹效果.水波效果以图片为背景,点击图片任意位置都会触发.有时候,我们使用普通的 Javasc ...

  5. 使用canvas制作在线画板

    canvas绘图的强大功能,让人前仆后继的去研究它.代码全部加起来不足百行.还用到了h5中的<input type="color"/>和<input type=& ...

  6. 怎样用HTML5 Canvas制作一个简单的游戏

    原文连接: How To Make A Simple HTML5 Canvas Game 自从我制作了一些HTML5游戏(例如Crypt Run)后,我收到了很多建议,要求我写一篇关于怎样利用HTML ...

  7. 利用canvas制作乱跑的小球

    canvas制作乱跑的小球 说明:将下面的代码放到html的body就可以,键盘控制上(W)下(S)左(A)右(D) <body> <canvas id="canvas&q ...

  8. <canvas合成海报>所遇问题及解决方案总结

    最近做了一个用canvas合成海报图片的移动端项目,由于一点canvas基础都没有,所以去网上搜了一位前辈的demo,但是开发过程中遇到了很多问题,现将所遇问题及解决方法总结如下: 1.移动端canv ...

  9. 使用Canvas制作时钟动画

    复习Javascript到Canvas的知识点,看到一个使用Canvas绘制的静态时钟例子,便想将其变成动态显示系统时间的时钟动画.另外再配上数字显示的时钟,一个小的时钟模块的诞生了!目前的界面还比较 ...

随机推荐

  1. 转发有关tomcat和nginx

    nginx 与 tomcat 组合搭建web服务   部分内容转自 http://www.cnblogs.com/naaoveGIS/ 1. Web服务 nginx是常用的web服务器,用于获取静态资 ...

  2. matlab图形中添加文本框

    图形中添加文本框,自己目前了解到了两种方法:1.用legend函数就可以对图形标注,形成一个文本框: 2.就是用annotation('textbox',[0.2,0.2.0.1,0.3],'Line ...

  3. OSPF协议原理及配置4-邻接关系的建立和LSDB同步

    OSPF协议原理及配置4-邻接关系的建立和LSDB同步   进入ExStart状态后,广播和NBMA型网络要等待4倍的Hello时间,确定DR和BDR.然后建立邻接关系,并交互链路状态通告,以使用LS ...

  4. 移动端ios网页版收起键盘导致页面空白解决办法

    失焦的时候把窗口滚动位置设置到(0,0)就行了 <input type="text" onblur="window.scrollTo(0, 0);"> ...

  5. git 回滚方式

    git push 命用于从将本地的分支版本上传到远程并合并. 命令格式如下: git push <远程主机名> <本地分支名>:<远程分支名> 如果本地分支名与远程 ...

  6. 【面经】MySql常见问题

    1. 数据库三范式是什么? 1. 第一范式(1NF):字段具有原子性,不可再分.(所有关系型数据库系统都满足第一范式数据库表中的字段都是单一属性的,不可再分) 2. 第二范式(2NF)是在第一范式(1 ...

  7. [NOIP2013 普及组] 表达式求值

    [NOIP2013 普及组] 表达式求值 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. Input 一行,为需要你计算的表达式,表达式中只包含数字.加法运算符"+" ...

  8. RabbitMQ Go客户端教程4——路由

    本文翻译自RabbitMQ官网的Go语言客户端系列教程,本文首发于我的个人博客:liwenzhou.com,教程共分为六篇,本文是第四篇--路由. 这些教程涵盖了使用RabbitMQ创建消息传递应用程 ...

  9. Docker容器入门实践

    Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 ...

  10. jinja2.exceptions.TemplateNotFound 报错处理

    一.检查模板文件夹是否正确. 遇到这个问题,首先需要检查你的模板文件夹命名是否规范,Flask默认会在工程下寻找templates文件夹,这个是默认配置,不能写成template或者其他名字.当然,如 ...