解决使用canvas生成含有微信头像的邀请海报没有微信头像

最近做了一个微信内访问的H5页面,长按分享图片发送朋友邀请的海报,网上搜索资料,得出解决思路,用canvas将页面绘制生成图片,

问题:canvas 图片跨域。

解决过程(填坑历程):

1.从网上存在如图解决办法     img.crossOrigin  = ""   (专业采坑,数年)。亲测无效。很是不解。

2.网上也存在后端服务解决

设置header头,或者nginx 服务配置等 允许访问。但是,存在问题(图片大部分为了优化,都会存放在第三方cdn.上面。这是第三方的配置,是否允许,自己很难控制)

3.解决办法:采用所有图片路径,转化为base64流来处理。图片存为本地图片。这也可以就避开了跨域问题。

最后个人解决方法:没有采用第3种保存本地,这样会增加本地图片,而且会存在本地跟微信端没有同步更新的问题,不是用户最新的头像。个人是采用远程下载后直接绘制输出图片,这样图片就变成本地图片,解决canvas绘制图片不支持跨域问题。

wxheadimg.aspx 页面代码:

        if (!string.IsNullOrEmpty(Request.QueryString["data"].ToString()))
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Request.QueryString["data"].ToString());
            request.Timeout = 3000;
            WebResponse response = request.GetResponse();
            Stream stream = response.GetResponseStream();

            Bitmap image = new Bitmap(stream);
            //保存为PNG到内存流
            MemoryStream ms = new MemoryStream();
            image.Save(ms, ImageFormat.Png);

            //重新输出头像
            Response.BinaryWrite(ms.GetBuffer());
            Response.End();

            ms.Close();
            response.Close();
            stream.Close();
        }

canvas绘制页面引用:<img src="wxheadimg.aspx?data=headimgurl" />

canvas绘制代码也顺便弄出来:

<script type="text/javascript">
window.onload = function ()
{
    var IMAGE_URL;
    function takeScreenshot(){
        var shareContent = document.getElementById(‘shareMember‘);//需要截图的包裹的(原生的)DOM 对象
        var width = shareContent.offsetWidth; //获取dom 宽度
        var height = shareContent.offsetHeight; //获取dom 高度
        var canvas = document.createElement("canvas"); //创建一个canvas节点

        var scale = 1; //定义任意放大倍数 支持小数
        canvas.width = width * scale; //定义canvas 宽度 * 缩放
        canvas.height = height * scale; //定义canvas高度 *缩放
        canvas.getContext("2d").scale(scale, scale); //获取context,设置scale

        //var rect = shareContent.getBoundingClientRect();//获取元素相对于视察的偏移量
        //canvas.getContext("2d").translate(-rect.left, -rect.top);//设置context位置,值为相对于视窗的偏移量负值,让图片复位
        var opts = {
            scale:scale, // 添加的scale 参数
            canvas:canvas, //自定义 canvas
            logging: true, //日志开关
            width:width, //dom 原始宽度
            height:height, //dom 原始高度
            backgroundColor: ‘transparent‘,
        };
        html2canvas(shareContent, opts,{useCORS:true,logging:true}).then(function (canvas)
        {
            IMAGE_URL = canvas.toDataURL("image/png");
            $(‘.copyImage‘).attr(‘src‘,IMAGE_URL);
        })
    }
    takeScreenshot();
}
</script>

页面代码 :

    <div class="shareBox" id="shareMember">
		<div class="top">
			<div class="logo"><img src="wxheadimg.aspx?data=微信头像网址"/></div>
		</div>
        <div class="middle">
            <img src="makeQRCode.aspx?data=二维码内容" class="qrcode" />
        </div>
        <img src="" class="copyImage">
    </div>

.shareBox{position:relative}
.shareBox .copyImage{position:absolute;top:0px;left:0px;z-index:999;opacity:0;height:666px;width:666px;}

  

最后: 人人为我,我为人人,美美与共

原文地址:https://www.cnblogs.com/pendy/p/11717104.html

时间: 2024-09-30 22:09:23

解决使用canvas生成含有微信头像的邀请海报没有微信头像的相关文章

android 实现类似微信缓存和即时更新好友头像

引言 使用微信时我们会发现,首次进入微信的好友列表时,会加载好友头像,但是再次进入时,就不用重新加载了,而且其他页面都不用重新加载,说明微信的好友头像是缓存在本地的,然后好友修改头像后,又会及时的更新,这个功能是如何实现的呢,我们来分析一下 分析 关于头像缓存的实现 头像是网络图片,而且数据量较大,如果用我们常用的SharedPreferences将头像以Bitmap的形式存储,势必会造成OOM,这个方法是行不通的,我们存储的只能是图片的地址,但是如果只存储地址的话,要转化成图片,还是要通过网络

【微信公众平台开发】微信刮刮乐,解决三星兼容性问题

刮刮乐jquery插件:wScratchPad 完整项目资源下载:点击打开链接 运用wScratchPad插件很快弄出刮刮乐的效果,代码如下: <!DOCTYPE html> <html> <head> <meta CHARSET="UTF-8"> <title>刮刮乐</title> <script type="text/javascript" src="./inc/jquer

使用EXECUTE IMMEDIATE来生成含有绑定变量的SQL

一个SQL,通过SPM固定它的执行计划,可以通过DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE实现.也可以通地此功能在不修改原SQL的情况下对其加HINT来固定执行计划.DB VERSION:Oracle 11.2.0.4OS:CentOS 6.6例如:原SQL走索引:SELECT * FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;想通过加HINT让其走全表扫描:SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB

解决PHP后端生成的图片无法使用CDN缓存的方法

解决PHP后端生成的图片无法使用CDN缓存的方法 今天发现线上有个问题,线上一个图片域名,在前端已经加了CDN缓存,不落缓存,则用PHP动态实现图片缩放,但经PHP处理过的图片输出后,每次都要从后端读取,后端服务器压力瞬间增加,经分析,PHP中没有作304的处理, HTTP的原理是这样的,每次请求到服务器后,服务端检测有没有修改,如没有修改,可以直接返回一个304的状态码,这样就用客户端的缓存了,CDN的原理就是如此,如果设置了304,就会将相应的URL进行缓存起来: 参考来源:  http:/

通过生成支付二维码来实现微信支付的解决方案 - EasyWechat版(转)

上一篇我们讲了在微信浏览器内实现微信支付的功能,它特别适合于一些基于微信公众号的h5站点等,支付流程也相当流畅,但是... 还有一种情况,比如现在北哥兄弟连PC版,是生成了一个二维码,这个二维码是专属的,扫描后直接就蹦出了支付页面.现在告诉你它如何实现的~ 本文相关框架 Yii2 EasyWechat 忆往昔 上节课我们讲了一个很重要的概念,那就是预支付交易回话标识 "我们先调用接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再按扫码.JSAPI.APP等不同场景生成交易串

X5内核浏览器video自动全屏解决办法-canvas

最近在做手机端上面播放视频的项目,但是在安卓上面,video的播放是脱离页面,置于最顶层的,所以带来了很多问题,为了解决这个问题,查看了多方资料,写了下面简单的demo,方便以后使用. 下面就是运用canvas重绘video视频. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport&quo

gcc生成含有C信息的汇编

title: gcc生成含有C信息的汇编 tags: gcc date: 2018-10-24 23:40:19 --- https://www.cnblogs.com/fengkang1008/p/4652193.html Gas的在线文档url:http://sourceware.org/binutils/docs-2.20/as/ Gas的命令行参数:http://sourceware.org/binutils/docs-2.20/as/Invoking.html#Invoking 命令如

C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案

在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统.微信应用.微信小程序.APP等方面,都可以直接调用基于JSON数据格式的Web API接口,在我之前的几篇随笔中,对这方面都有一定的介绍,本篇继续这个主题,细致深入的阐述如何在接口和源码的基础上整合Web API.微信后台管理及前端微信小程序的应用方案. 1.基于Web API的微信开发框架 首先我们各个业务模块,都应该围绕着Web API进行展开,

C#开发微信门户及应用(6)--微信门户菜单的管理操作

前面几篇继续了我自己对于C#开发微信门户及应用的技术探索和相关的经验总结,继续探索微信API并分享相关的技术,一方面是为了和大家对这方面进行互动沟通,另一方面也是专心做好微信应用的底层技术开发,把基础模块夯实,在未来的应用中派上用途.本随笔继续介绍微信门户菜单的管理操作. 1.菜单的基础信息 微信门户的菜单,一般服务号和订阅号都可以拥有这个模块的开发,但是订阅号好像需要认证后才能拥有,而服务号则不需要认证就可以拥有了.这个菜单可以有编辑模式和开发模式,编辑模式主要就是在微信门户的平台上,对菜单进