js+canvas合成图片实现微信公众号海报功能

在微信公众号开发中,很多时候都有个需求是一张图加上头像和昵称或者其他数据生成自己的二维码海报或者是生成分享海报

这个需求,php的gd库是可以实现的,但是用服务器进行图片合成,会消耗服务器大量的资源

所以我们可以考虑用以下方式实现

一:js的canvas图片合成方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

$(function () {        draw(function () {//生成之后的回调

            $('#img')[0].innerHTML='<img src="'+base64[0]+'">';//将base生成图片

        });

    });

    var data=[图片1地址,图片2地址,图片3地址];

    base64=[];//用于保存生成之后的base64

    function draw(fn) {

        var img1= new Image;

        img1.src = data[0];

        img1.onload = function () {//这步必须,因为图片加载是异步的,必须等图片加载完成才开始下面的这些步骤

            var c = document.createElement('canvas'),

                    ctx = c.getContext('2d');

                        c.width = img1.naturalWidth;

                        c.height = img1.naturalHeight;

                        ctx.rect(0, 0, c.width, c.height);

                        ctx.fillStyle = '#fff';

                        ctx.fill();

            //生成一张图片1的底图

                          

            /*下面是为底图增加上文字*/

            ctx.drawImage(img1, 0, 0, c.width, c.height);(绘制图片资源,x坐标,y坐标,宽,高)

            //设置字体样式

            ctx.font = "24px Courier New";

            //设置字体填充颜色

            ctx.fillStyle = "write";

            //从坐标点(92,800)开始绘制文字

            ctx.fillText("这是文字内容", 92, 800);

            /*上面是增加文字,可以无限加*/

              

              

            var img2= new Image;

            img2.src = data[1];

            img2.onload = function () {//同理,如果是加载图片的话,需要等图片加载出来再下一步,所以要加onload

                ctx.drawImage(img2, 245, 660, 150, 150);(绘制图片资源,x坐标,y坐标,宽,高)

                    base64.push(c.toDataURL("image/jpeg", 1));//如果绘制完成了,就把base64数据填进数组,然后回调,没完成则继续这步

                fn();//回调

            };

        };

    }

 ///如果是坐标相同,或者觉得代码这样不美观的,可以使用递归方法实现onload的步骤,例如:

  

    function draw(fn) {

              

         a(0);

           

         fn();

    }

   

 function a(i){ 

       if (i == 0) {

         var img1= new Image;

        img1.src = data[0];

        img1.onload = function () {

            var c = document.createElement('canvas'),

            ctx = c.getContext('2d');

                        c.width = img1.naturalWidth;

                        c.height = img1.naturalHeight;

                        ctx.rect(0, 0, c.width, c.height);

                        ctx.fillStyle = '#fff';

                        ctx.fill();

            //生成一张图片1的底图

                          

            /*下面是为底图增加上文字*/

            ctx.drawImage(img1, 0, 0, c.width, c.height);(绘制图片资源,x坐标,y坐标,宽,高)

            //设置字体样式

            ctx.font = "24px Courier New";

            //设置字体填充颜色

            ctx.fillStyle = "write";

            //从坐标点(92,800)开始绘制文字

            ctx.fillText("这是文字内容", 92, 800);

            /*上面是增加文字,可以无限加*/

            a(1);//到第2个步骤

        }

        else if (i == 1) {

           var img2= new Image;

            img2.src = data[1];

            img2.onload = function () {//同理,如果是加载图片的话,需要等图片加载出来再下一步,所以要加onload

                ctx.drawImage(img2, 245, 660, 150, 150);(绘制图片资源,x坐标,y坐标,宽,高)

                    base64.push(c.toDataURL("image/jpeg", 1));//如果绘制完成了,就把base64数据填进数组,然后回调,没完成则a(2)到第三步;

                return;

            };

        

   }

二:使用html2canvas进行网页保存成图片//需引入html2canvas.js

1

2

3

4

5

6

7

<div class="qrcodepic">

    <img src="图片1" class="qrbg">

    <img src="图片2" class="qrcode" />

    <span class="niname"><img src="图片3" class="touxiang" />文字</span>

    <div class="qrcodemain"></div>

</div>

//使用css进行网页布局

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

$(window).load(function(){

    var shareContent = $(".qrbg")[0]; 

    var width = shareContent.offsetWidth; 

    var height = shareContent.offsetHeight;

    $(".qrcodepic").height(height);

    var canvas = document.createElement("canvas"); 

    var scale = 2; 

    canvas.width = width * scale; 

    canvas.height = height * scale; 

    canvas.getContext("2d").scale(scale, scale); 

    var rect = shareContent.getBoundingClientRect();

    canvas.getContext("2d").translate(-rect.left,-rect.top);

    var opts = {

        scale: scale, 

        canvas: canvas, 

        width: width, 

        height: height,

        useCORS:true

    };

    html2canvas($(".qrcodepic"), opts).then(function (canvas) {

        dataURL =canvas.toDataURL("image/png");

        $(".qrcodemain").html("<img src='"+dataURL+"' style='display:block; width:100%;' />");

    });

});

完活。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值