canvas微信图片生成海报

前言

之前在做项目的时候需要做一个生成海报的功能,最初使用的html2canvas这个工具,在使用过程中发现安卓上的海报是正常的,而苹果上样式有问题,例如错、空白,最终选择直接用canvas自己画。

难点

海报中重要的二维码是一个线上地址,存在于微信服务器上,受同源策略的影响,在调用canvas.toDataURL 是报错,不允许域外资源,防止画布被污染。

解决

因为当前项目使用了Koa,就想到把图片下载到本地。
流程如下图:
在这里插入图片描述

*注:koa发送到Java后端这部分属于服务器对服务器发送请求不存在跨域,跨域是针对浏览器来说的。

前端代码

   loadImage(src){
        return new Promise((resolve, reject) => {
            let xhr = null;
            if (window.XMLHttpRequest)
                xhr = new XMLHttpRequest();
            else if (window.ActiveXObject)
                xhr = new ActiveXObject('Microsoft.XMLHTTP');
            xhr.onload = () => {
                if (xhr.status === 200) {
                    const reader = new FileReader();
                    reader.addEventListener('load', () => resolve(reader.result), false);
                    reader.addEventListener('error', e => reject(e), false);
                    reader.readAsDataURL(xhr.response);
                    
                } else {
                    reject(`Failed to proxy resource ${src} with status code ${xhr.status}`);
                }
            };
            xhr.onerror = reject;
            xhr.open('GET', src,true);
            // 设置请求头部
            //xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8');

            xhr.responseType = 'blob';
            xhr.send();
        });
    }


		//  在react 中使用
        this.loadImage('/httpImg?url='+url).then(res=>{
        	// res 就是 base64
            this.setState({ imgBase64:res });
        }).catch(err=>{
            cb.utils.alert('获取微信二维码失败:'+err,'error');
        })

koa转发请求

    router.get('/httpImg', async function (ctx) {
        ctx.set('Access-Control-Allow-Origin', '*');
        ctx.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
        ctx.set('Access-Control-Allow-Methods', 'GET, OPTIONS');
        try {
            const url = decodeURI(ctx.request.query.url);
            const result = request.get(url);
            ctx.body = result;
        } catch (e) {
            ctx.body = {
                code: 500,
                message: e.message
            }
        }
    })
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值