vue实现二维码广告图片

主要分析一下在vue中怎样简单实现二维码广告图片,在微信上可以直接保存为图片到相册,也可以直接扫描. 最终实现的效果如下图,红色部分可换成自己的logo.


最终效果1.png
最终效果2.png
保存到相册后的效果.png

下面主要说说我的具体实现思路:(代码中都省去了样式和图片)
1.使用html2canvas.
界面都是h5实现, 显示时将h5转换成img替换原来的h5模块, 这种实现思路相对简洁,缺点是html2canvas必须等h5在界面上显示完才能将其转换成img,因此会出现界面闪烁,影响用户体验. 具体实现代码如下:

<template>
    <div class="QrcodePage" ref="QrcodePage">
        <div class="qrContent" ref="qrContent">
            <template v-if="qrContentImage == null">
                <div class="qrTitle">
                    <img class="qrTitleLogo" src="">
                </div>
                <div class="qrCon">
                    <div class="qrConTip">欢迎使用微信扫码</div>
                    <div class="qrConBg">
                        <qrcode :value="qrcodeUrl" :size="190" class="qrcode" type="canvas" level="H"></qrcode>
                        <div class="minLog">
                            <div>
                                <img src="">
                            </div>
                        </div>
                    </div> 
                </div>
                <div class="qrFooter">王老五   18600000000</div>
            </template>
            <template v-else>
                <img v-bind:src="qrContentImage" class="qrContentImage">
            </template>
        </div>
        <div class="tip" @click="canvasImage">长安保存图片</div>
        <img class="close" src="" @click="closeClick"> 
    </div>
</template>
<script>
import html2canvas from 'html2canvas'
import { Qrcode } from 'vux'
export default {
    name: 'agentQrcode',
    data(){
        return {
            qrContentImage: null
        }
    },
    computed: { 
        qrcodeUrl: function(){
            return "http://www.baidu.com"
        }
    },
    components: {
        Qrcode
    },
    mounted: function () {
        this.canvasImage()
    },
    methods: {
        canvasImage: function() {
            var that = this 
            html2canvas(this.$refs.qrContent).then(function(canvas) {
                that.qrContentImage = canvas.toDataURL('image/jpeg', 1.0);
            });
        },
        closeClick: function() {
        }
    }
}
</script>

2.使用canvas画图实现
这种实现比第一种难度稍微大一点,需要对canvas画图api有一定的了解, 但实现效果好. 具体实现代码如下:

<template>
    <div class="QrcodePage" ref="QrcodePage">
        <img class="qrcanvas" width="270" height="390" ref="mycanvas">
        <div class="tip" @click="canvasImage">长安保存图片</div>
        <img class="close" src="换成自己的图片路径" @click="closeClick"> 

        <qrcode class="aQrCode" ref="aQrCode" v-show="false" :value="qrcodeUrl" type="img" :size="100" level="H"></qrcode>
        <img ref="titleLogoImg" v-show="false" width="152" height="37" src="换成自己的图片路径">
   
    </div>
</template> 
<script>

import html2canvas from 'html2canvas'
import { Qrcode } from 'vux' 
export default {
    name: 'agentQrcode',
    data(){
        return { 
            qrcodeUrl:"www.baidu.com",
            imgData: ''
        }
    }, 
    components: {
        Qrcode
    }, 
    methods: {
        canvasImage: function() {
            var drawing = document.createElement('canvas');
            drawing.width = 270
            drawing.height = 390 
            var context = drawing.getContext("2d");
            context.fillStyle="white"; 
            context.fillRect(0, 0, 270, 71); 
            context.fillStyle="#FEBD17";
            context.fillRect(0, 71, 270, 319);  
            var titleLogoImg = this.$refs.titleLogoImg 
            context.drawImage(titleLogoImg, 58, 19, 152, 37);
            this.drawRoundedRect(context, 22, 87, 225, 22, 11, 1, '#fff', '#fff') 
            context.font="14px PingFangSC-Medium";
            context.fillStyle="#000000";
            context.fillText("欢迎使用微信扫码", 65, 102, 140); 
            this.drawRoundedRect(context, 22, 117, 225, 225, 8, 1, '#fff', '#fff') 
            context.font="14px PingFangSC-Medium";
            context.fillStyle="#fff";
            context.textAlign="center";
            context.fillText("王老五     18600000000", 135, 370); 
            var aQrCodeImg = this.$refs.aQrCode;
            var qrImg = document.createElement('img')
            qrImg.src=aQrCodeImg.imgData
            context.drawImage(qrImg , 37, 132, 195, 195); 
            this.drawRoundedRect(context, 113, 208, 50, 50, 4, 1, '#fff', '#fff') 
            this.drawRoundedRect(context, 118, 213, 40, 40, 4, 1, '#DFDFDF', '#fff') 
            var logoImg = new Image()
            logoImg.src = require('换成自己的图片')
            context.drawImage(logoImg , 124, 218, 28, 28); 
            this.$refs.mycanvas.src = drawing.toDataURL("image/png");  
        },
        drawRoundedRect: function (ctx, x, y, w, h, r, bdWidth, bdColor, bgcolor){
            ctx.beginPath();
            ctx.moveTo(x+r,y);
            ctx.lineWidth = bdWidth;
            ctx.strokeStyle = bdColor;
            ctx.fillStyle = bgcolor;
            ctx.arcTo(x+w,y,x+w,y+h,r);
            ctx.arcTo(x+w,y+h,x,y+h,r);
            ctx.arcTo(x,y+h,x,y,r);
            ctx.arcTo(x,y,x+w,y,r);
            ctx.stroke();
            ctx.fill();
            ctx.closePath();
        },
        closeClick: function() { 
        }
    }
}
</script>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,265评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,335评论 0 17
  • 你能看到的善良,总有人告诉你,那是假的。你从未能想象到的邪恶,却总有人在验证,都是真的。 可怕的不是堕落,而是堕落...
    bluebirds阅读 7,888评论 4 34
  • 成长大概就是 当你开始接受原来不是每一次聚餐都有人亲手为你夹菜 不是每一次朋友之间的冷战赌气下一秒都能尽释前嫌 不...
    已非故阅读 309评论 0 1
  • 现在做菜第一步是搜网上的菜谱,然后根据菜谱买食材,稍微改改,就成为了自己的一道菜。感谢热心的网友无私的贡献。 鳊鱼...
    noone2阅读 515评论 0 0