canvas生成图片

canvas生成图片

结构
注意不要用v-if控制显示隐藏,canvas在dom被删除后在显示时画布上的内容会消失

<div class="mask_operation" v-show="cvsshow">
            <div class="cvs-box">
                <canvas id="mycvs" v-show='false' ref="cvs" width="600" height="738"></canvas>
                <img :src="cvsimg" alt="">
            </div>
            <div class="savebtn" @click="saveImg">长按保存到手机相册</div>
            
        </div>

js
注意:canvas 调用cvs.toDataURL("image/png");生成图片常见的坑
绘制的图片在画布上不显示:
原因:绘制路径时图片还未加载完,要在 img.onload 函数内绘制路径

画布绘制完成显示正常,生成图片时失败,或生成的图片只有文字
原因:canvas生成图片时会有各种图片跨越的报错
解决方法:
1.给img标签加上crossOrigin属性,默认值为anonymous,元素的跨域资源请求不需要凭证标志设置

              let img = new Image()
              img.src = imgsrc
              img.crossOrigin = ""

2.将图片转为base64格式,(这个可以请后台人员给个转换的接口)

 this.$http.get('https://ssl2.xxxxx.net/qr_code/index/getImgBase?url='+imgsrc).then((res)=>{
    
 })
// 生成活动图片
           createdImg(){
               let imgsrc = this.goodsList[this.user_index].img_url
               
               this.maskShow = false
               this.cvsshow = true
               let cvs = this.$refs.cvs
               let ctx=cvs.getContext("2d"); //获取画布2d对象
               var ratio =  this.getPixelRatio(ctx);
               // cvs.width = canvas.width * 2
               // cvs.height = canvas.height * 2;
               ctx.fillStyle="#fff"
               ctx.fillRect(0,0,300*2,369*2)
               ctx.save()
               ctx.beginPath();

               ctx.font = "30px Arial"
               ctx.fillStyle="#EB4E3F";
               ctx.textBaseline='middle'
               ctx.fillText("邀您一起淘好物",75*2,51*2);

               ctx.font = "24px Arial"
               ctx.fillStyle = "#EB4E3F"
               ctx.textBaseline = "bottom"
               ctx.fillText('¥',15*2,325*2)

               ctx.font = "48px Arial"
               ctx.fillStyle = "#EB4E3F"
               ctx.textBaseline = "bottom"
               ctx.fillText('208',27*2,328*2)

               ctx.font = "24px Arial"
               ctx.fillStyle = "#999999"
               ctx.textBaseline = "bottom"  
               let pp = 360
               ctx.fillText('¥360',72*2,325*2)

               ctx.fillText('卡云亲子乐园',15*2,355*2)
               ctx.save()
               ctx.beginPath();
               
               ctx.lineWidth = 0.3;
               ctx.moveTo(72*2,318*2)
               ctx.lineTo(112*2,318*2)
               ctx.stroke()

               ctx.fillStyle="#999";
               ctx.font = "24px Arial"
               ctx.textBaseline='middle'
               ctx.fillText("-长按识别小程序码-",186*2,356*2);
               
               //这里是后台提供的一个借口,将网络图片转为base64
               this.$http.get('https://ssl2.xxxxx.net/qr_code/index/getImgBase?url='+imgsrc).then((res)=>{
                   imgsrc = res.data.data
                   let img = new Image()
                   img.src = imgsrc
                   img.crossOrigin = ""
                   
                   //确保图片已完成加载在绘制路径
                   img.onload = ()=>{
                       ctx.arc(35*2,40*2,25*2,0,2*Math.PI);
                       ctx.strokeStyle="#BFBFBF";
                       // ctx.stroke();
                       ctx.clip();
                       ctx.drawImage(img,10*2,15*2,50*2,50*2)
                       ctx.restore()

                       let img2 = new Image()
                       img2.src = imgsrc
                       img2.crossOrigin = ""
                       img2.onload = ()=>{
                           ctx.drawImage(img2,0,75*2,300*2,168*2)
                           let img3 = new Image()
                           img3.src = imgsrc
                           img3.crossOrigin = ""
                           img3.onload = ()=>{
                               ctx.drawImage(img3,192*2,246*2,93*2,93*2)
                               this.cvsimg = cvs.toDataURL("image/png");
                           }
                       }
                       
                   }
               })

               
               

           }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容