移动端canvas合成图片,填充文字自动换行

骑猪看日落 2022-05-31 07:45 397阅读 0赞

今天用canvas合成带有微信公众号二维码和祝福语的春节贺卡
这里写图片描述
由于代码都是原生的没有引入其他库,所以直接将对应部分贴出来吧。

html

  1. <!--画布 -->
  2. <canvas id="canvas" class="hide">
  3. Your browser does not support the HTML5 canvas tag.
  4. </canvas>
  5. <!--背景图-->
  6. <img id="page2_bg" src="images/greeting_card1.jpg" class="hide"/>
  7. <!--二维码-->
  8. <img id="test1" class="hide" src="images/code.png" />
  9. <!--装图片的容器-->
  10. <div id="new-img-div" class="hide">
  11. <img src="images/close.png" class="close-img"/>
  12. <div id="onlyoneImg"></div>
  13. </div>

css:

  1. .hide { display: none; }

其他元素布局的样式就不贴了,毕竟没有难度

接下来看看重头戏js:

  1. //给canvas定宽高
  2. var bodyW = $('body').width()+'px';
  3. var bodyH = $('body').height()+'px';
  4. console.log('bodyW',bodyW);
  5. console.log('bodyH',bodyH);
  6. $("#canvas").attr('width','640px')
  7. $("#canvas").attr('height','1138px')
  8. //画图函数
  9. function writeTextOnCanvas(cns, lh, rw, text){
  10. var cns = document.getElementById(cns);
  11. var ctx = cns.getContext("2d");
  12. //提供canvas的数据
  13. var canvasW = $('#canvas').width();
  14. var canvasH = $('#canvas').height();
  15. console.log('canvasW',canvasW)
  16. //
  17. var wordsTop = canvasH*0.185;
  18. var wordsLeft = canvasW*0.195;
  19. var wordsAllWidth = canvasW*0.65;
  20. console.log(wordsAllWidth)
  21. var wordsNumOnline = parseInt(wordsAllWidth/12)
  22. var img1=document.getElementById("page2_bg");
  23. var img2= document.getElementById("test1");
  24. //var img111 = img1.attr('src');
  25. console.log(img1);
  26. //画背景
  27. ctx.drawImage(img1,0,0,canvasW,canvasH);
  28. //画二维码
  29. ctx.drawImage(img2,428,884,171,172);
  30. //处理文字
  31. var lineheight = lh;
  32. var text = text;
  33. ctx.width = cns.width;
  34. ctx.height = cns.height;
  35. //字体大小必须和字体类型一起设置
  36. ctx.font="24px Helvetica";
  37. //字体颜色
  38. ctx.fillStyle = '#f6dda0';
  39. function getTrueLength(str){ //获取字符串的真实长度(字节长度)
  40. var len = str.length, truelen = 0;
  41. for(var x = 0; x < len; x++){
  42. if(str.charCodeAt(x) > 128){
  43. truelen += 2;
  44. }else{
  45. truelen += 1;
  46. }
  47. }
  48. return truelen;
  49. }
  50. function cutString(str, leng){ //按字节长度截取字符串,返回substr截取位置
  51. var len = str.length, tlen = len, nlen = 0;
  52. for(var x = 0; x < len; x++){
  53. if(str.charCodeAt(x) > 128){
  54. console.log('汉字')
  55. if(nlen + 2 < leng){
  56. nlen += 2;
  57. }else{
  58. tlen = x;
  59. break;
  60. }
  61. }else{
  62. console.log('字符')
  63. if(nlen + 1 < leng){
  64. nlen += 1;
  65. }else{
  66. tlen = x;
  67. break;
  68. }
  69. }
  70. }
  71. return tlen;
  72. }
  73. for(var i = 1; getTrueLength(text) > 0; i++){
  74. //分行
  75. var tl = cutString(text, wordsNumOnline);
  76. ctx.fillText(text.substr(0, tl).replace(/^\s+|\s+$/, ""), wordsLeft, i * lineheight + wordsTop);
  77. text = text.substr(tl);
  78. }
  79. //转化成图片
  80. var flagImg = document.createElement("img");
  81. flagImg.src = cns.toDataURL("image/png");
  82. $("#onlyoneImg").append(flagImg);
  83. $('#canvas').addClass('hide');
  84. }
  85. writeTextOnCanvas("canvas", 32, 40, '祝你新年快乐,万事如意');

有一点需要注意的:

  1. flagImg.src = cns.toDataURL("image/png");

这里的转化会出现跨域问题,所以合成的图片来源必须要是同源。

发表评论

表情:
评论列表 (有 0 条评论,397人围观)

还没有评论,来说两句吧...

相关阅读