vue 合成图片

目的:将二维码图片和背景图片合成变成一张图片
方法一:
引入依赖
cnpm install qrcanvas --save
cnpm install html2canvas --save
具体代码:
<!-- 分享图片生成 -->
<template>
<div class="container">
<div class="share-img">
<img :src="imgUrl" alt="分享图">
</div>
<div class="creat-img" ref="box">
<img src="../assets/images/activity/txvip.jpeg" alt="分享背景图">
<div id="qrcode" class="qrcode"></div>
</div>
</div>
</template> <script>
import { qrcanvas } from 'qrcanvas';
import html2canvas from 'html2canvas';
export default {
data () {
return {
imgUrl:'',
}
},
watch:{
imgUrl(val,oldval){
//监听到imgUrl有变化以后 说明新图片已经生成 隐藏DOM
this.$refs.box.style.display = "none";
}
},
created() {
let that = this;
that.$nextTick(function () {
//生成二维码
var canvas1 = qrcanvas({
data: decodeURIComponent(that.$route.query.url),
size:128
});
document.getElementById("qrcode").innerHTML = '';
document.getElementById('qrcode').appendChild(canvas1); //合成分享图
that.$indicator.open({
text: '正在生成图片...',
spinnerType: 'fading-circle'
});
html2canvas(that.$refs.box).then(function(canvas) {
that.imgUrl = URL.createObjectURL(that.base64ToBlob(canvas.toDataURL()))
setTimeout(()=>{
that.$indicator.close();
that.$toast({
message: '图片已生成,长按保存分享给你的好友吧',
position: 'middle',
duration: 3000
});
},2000)
});
})
}, methods: {
//base64转blob
base64ToBlob(code) {
let parts = code.split(';base64,');
let contentType = parts[0].split(':')[1];
let raw = window.atob(parts[1]);
let rawLength = raw.length; let uInt8Array = new Uint8Array(rawLength); for (let i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i);
}
return new Blob([uInt8Array], {type: contentType});
},
}
} </script>
<style lang='scss' scoped>
.creat-img{
img{
z-index: 3;
}
.qrcode{
position: absolute;
bottom: .15rem;
left: 50%;
margin-left: -64px;
z-index: 5;
}
} </style>
方法二:
html:
<template>
<div class="container">
<div id="imgBox" align="center"> </div>
</div>
</template>
js:
var qr_div = document.getElementById('qr_code').children[0];
var data = ['http://cdnzzz.vcgeek.cn/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20190118153442.jpg', '' + qr_div.src];
var base64 = [];
var c = document.createElement('canvas'),
ctx = c.getContext('2d'),
len = data.length;
c.width = 750;
c.height = 1334;
ctx.rect(0, 0, c.width, c.height);
ctx.fillStyle = '#fff';
ctx.fill();
drawing(0);
function drawing(n) {
if(n < len) {
var img = new Image;
img.crossOrigin = 'anonymous'; //解决跨域
img.src = data[n];
img.setAttribute("crossOrigin", 'Anonymous');
img.onload = function() {
if(n == 1) {
ctx.drawImage(img, 55, 1015, 200, 200); //121和129表示二维码距离背景图片左上角的X轴,Y轴,160表示生成的图片中二维码的大小
} else {
ctx.drawImage(img, 0, 0, c.width, c.height);
}
drawing(n + 1); //递归
}
} else {
console.log(c)
try {
//保存生成作品图片
base64.push(c.toDataURL("image/png",1)); //通过canvas.toDataURL转成base64.
document.getElementById('imgBox').innerHTML = '<img style="width:100%" class="invite_qrImg" src="' + base64[0] + '">';
// alert(base64[0].length)
} catch(e) {
//TODO handle the exception
console.log(alert(e))
}
}
}
html合成图片:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Html5 Canvas 实现图片合成</title> <style>
body{
text-align: center;
}
img {
border: solid 1px #ddd;
}
</style>
</head> <body>
<div align="center" style="display: none;">
<img src="./qr.png">
<img src="./qr.png">
</div>
<input type="button" value="一键合成" onclick="hecheng()">
<a href="" download id="downloadPic">下载合成图</a>
<div id="imgBox" align="center"> </div>
<script>
function hecheng() {
draw(function() {
document.getElementById('imgBox').innerHTML = '<img src="' + base64[0] + '">';
document.getElementById('downloadPic').href = base64[0];
})
} var data = ['qr.png', ''],
base64 = []; function draw(fn) {
var c = document.createElement('canvas'),
ctx = c.getContext('2d'),
len = data.length; console.log(data.length) c.width = 400;
c.height = 800;
ctx.rect(0, 0, c.width, c.height);
ctx.fillStyle = '#fff';
ctx.fill(); function drawing(n) {
if(n < len) {
var img = new Image;
//img.crossOrigin = 'Anonymous'; //解决跨域 img.src = data[n];
img.onload = function() {
if(n == 1) {
ctx.drawImage(img, 100, 100, 160, 160); //121和129表示二维码距离背景图片左上角的X轴,Y轴,160表示生成的图片中二维码的大小
} else {
ctx.drawImage(img, 0, 0, c.width, c.height);
} drawing(n + 1); //递归
}
} else {
//保存生成作品图片
base64.push(c.toDataURL()); //通过canvas.toDataURL转成base64.
//alert(JSON.stringify(base64));
fn();
}
}
drawing(0);
}
</script>
</body> </html>
vue 合成图片的更多相关文章
- [JavaScript] canvas 合成图片和文字
Canvas Canvas 是 HTML5 新增的组件,就像一个画板,用 js 这杆笔,在上面乱涂乱画 创建一个 canvas <canvas id="stockGraph" ...
- PHP合成图片、生成文字、居中对齐、画线、矩形、三角形、多边形、图片抗锯齿、不失真 高性能源码示例
function generateImg($source, $text1, $text2, $text3, $font = './msyhbd.ttf') { $date = '' . date ( ...
- ImageMagick利用蒙版合成图片
先看合成后的效果图. 需要的图片素材: 1.一张图片(335x600) 2.一张蒙版图片(335x600) 3.一张相框图片(335x600) 第一步,根据蒙板和图片,截取图片.而且所截取的图片之外的 ...
- PHP生成小程序二维码合成图片生成文字
这部分代码是写在项目上的代码,THINKPHP3.1如果迁移到其他的地方应该要稍稍改动一下以适合自己的项目 function get_bbox($text,$fsize,$ffile){ return ...
- $Django 路飞之小知识回顾,Vue之样式element-ui,Vue绑定图片--mounted页面挂载--路由携带参数
一 小知识回顾 1 级联删除问题 2 一张表关联多个表,比如有manytomanyfileds forignkey,基于对象查询存在的问题:反向查询的时候 表名小写_set.all()不知是哪个字段 ...
- 用imageMagick合成图片添加图片水印
用imageMagick合成图片的方式大致有三种, 使用convert命令加 +append或-append参数 使用convert命令加 -composite参数 直接使用composite命令来完 ...
- Django day 33 vue中使用element-ui的使用,课程的相关介绍,vue绑定图片,课程列表接口,课程详情页面
一:vue中使用element-ui的使用, 二:课程的相关介绍, 三:vue绑定图片, 四:课程列表接口, 五:课程详情页面
- 通过canvas合成图片
通过canvas合成图片 效果图 页面布局部分 两个图片以及一个canvas画布 <img src="https://qnlite.gtimg.com/qqnewslite/20190 ...
- php 合成图片,合成圆形图片
合成图片方法 <?php class Share { /* * 生成分享图片 * */ function cre_share_study_img(){ $auth = json_decode(b ...
随机推荐
- 阿里云虚拟主机安装wordpress,提示连接数据库失败的解决方法
很多新手在购买的虚拟主机后就开始尝试安装,却发现连接数据库老是出错,不知道什么问题,反复检查了自己填写的数据库连接信息发现也没有问题,这个时候我们似乎就没法了. 但这个其实是后台空间的设置问题,你 ...
- Docker详解(四) — Dockerfile剖析
目录 1.Dockfile简介 2. Dockerfile构建过程解析 3. Dockerfile体系结构 4. 案例 4.1 自定义mycentos 4.2 CMD/ENTRYPOINT 镜像案例 ...
- 后端开发实践系列之四——简单可用的CQRS编码实践
本文只讲了一件事情:软件模型中存在读模型和写模型之分,CQRS便为此而生. 20多年前,Bertrand Meyer在他的<Object-Oriented Software Constructi ...
- 重学Golang系列(一): 深入理解 interface和reflect
前言 interface(即接口),是Go语言中一个重要的概念和知识点,而功能强大的reflect正是基于interface.本文即是对Go语言中的interface和reflect基础概念和用法的一 ...
- Zabbix监控方案-官方最新4.4版本
Zabbix 2019/10/12 Chenxin 参考 https://www.zabbix.com/documentation/4.0/zh/manual https://baike.baidu. ...
- Linux学习资料网站汇总链接(持续更新ing)
排名不分先后. 学海无涯苦作舟. 博客: 1.slmba:LINUX博客原创大牛 2.edsionte's TechBlog:Linuxer (他的友情链接中还有一堆Linuxer,被公司屏蔽进不去. ...
- 深入理解C#多线程 -戈多编程
引用(http://www.cnblogs.com/luxiaoxun/p/3280146.html) 一.使用线程的好处 1.可以使用线程将代码同其他代码隔离,提高应用程序的可靠性. 2.可以使 ...
- linux上安装LAMP笔记
B哥最近在参加比赛,需要把一个php项目部署到服务器上,故此在linux上安装LAMP环境,用于部署项目,第一次安装,做点儿笔记记录一下. 安装条件: Redhat或者CentOS linux环境已装 ...
- 窥见云技术未来大势,腾讯云Techo开发者大会即将在京召开
云.物联网.5G.人工智能……一项项技术的突破带来了天翻地覆的变化,开发者们是如何一次次地进行天马行空的创意和极限突破?2019年11月6日-7日,由腾讯云主办的首届Techo开发者大会将在北京嘉里大 ...
- 第3章(2) Linux下C编程风格
Linux内核编码风格在内核源代码的Documentation/CodingStyle目录下(新版本内核在Documentation/process/coding-style.rst). 变量命名采用 ...