将一篇带有图片的文章合成一张图片,由于无法直接一起添加图片和文字,将图片和文字拆分开,挨个添加到画布上,可根据文字和图片的高度计算出需要创建画布的高度,并生成合适大小的画布

/***  获取要添加到画布的展示内容* @param $text  内容* @param int $fontsize 文字大小* @param int $width  要展示的最大宽度* @param int $height 要展示的最大高度* @param int $fontHeight  字体高度* @param int $eol_height  EOL高度* @return array*/public static function getShowText($text, $fontsize = 24, $width = 650, $height = 800, $fontHeight = 60, $eol_height = 10){$fontFile = public_path() . '/static/fonts/msyh.ttf';$content = str_replace("&nbsp;", "", $text);$arr = Util::spiltHtml($content);$h = 0;$contArr = array();foreach ($arr as $item) {if ($item['type'] == 'text') {$conTxt = self::autoWrap($fontsize, $fontFile, $item['text'], $width);$size = imagettfbbox($fontsize, 0, $fontFile, $conTxt);$strArr = explode(PHP_EOL, $conTxt);foreach ($strArr as $key => $item) {if (empty($item)) {$h += $eol_height;$contArr[] = ['type' => 'text', 'str' => $item, 'lineheight' => $eol_height];} else {$h += $fontHeight;$contArr[] = ['type' => 'text', 'str' => $item, 'lineheight' => $fontHeight];}if ($h >= $height) {break 2;}}} else if ($item['type'] == 'img') {try{$imginfo = getimagesize($item['src']);$maxImgWidth = ceil($width / 2);if ($imginfo[0] > $maxImgWidth) {$srcH = ceil($width * $imginfo[1] / $imginfo[0]);$h += intval(20 + $srcH);$contArr[] = ['type' => 'img', 'str' => $item['src'], 'w' => $width, 'h' => $srcH];} else {$h += $imginfo[1];$contArr[] = ['type' => 'img', 'str' => $item['src'], 'w' => $imginfo[0], 'h' => $imginfo[1]];}if ($h >= $height) {break;}} catch (\Exception $e){continue;}}}$res = ['h' => $h, 'txtArr' => $contArr];return $res;}/*** @param $fontsize   字体大小* @param $ttfpath   字体文件* @param $str      字符串* @param $width    最大宽度* @param int $fontangle  将被度量的角度大小* @param string $charset   编码* @return string*/public static function autoWrap($fontsize, $ttfpath, $str, $width, $fontangle = 0, $charset = 'utf-8'){$len = mb_strlen($str);$arr = array();$tmpArr = array();$tmpStr = '';for ($i = 1; $i <= $len; $i++) {$tmpStr = mb_substr($str, 0, $i);$size = imagettfbbox($fontsize, $fontangle, public_path() . '/static/fonts/msyh.ttf', $tmpStr);$w = $size[2];if ($w < $width) {if ($i < $len) {continue;} else {return $tmpStr;}} else {$arr[] = $tmpStr;$str2 = mb_substr($str, $i);$tmpStr .= PHP_EOL . self::autoWrap($fontsize, $ttfpath, $str2, $width);}break;}return trim($tmpStr, PHP_EOL);}/*** 将html文字和图片分类成数组* @param $str* @return array*/public static function spiltHtml($str){$content = stripslashes(strip_tags($str, "<img>"));preg_match_all('/<img.*?src=["|\'](.*?)["|\']/',$content, $match);$imgs = $match[1];$res = preg_split('/<img(.*?)>/',$content);foreach ($res as $key => $value) {if($value != ""){$result[] = array('type' => 'text','text' => htmlspecialchars($value, ENT_QUOTES, 'utf-8'));}if(!empty($imgs[$key])){$src = htmlspecialchars($imgs[$key], ENT_COMPAT , 'utf-8');$result[] = array('type' => 'img','src' => $src);}}return $result;}

小程序合成海报图片,高度自适应相关推荐

  1. 微信小程序合成海报_利用微信小程序中Canvas API来合成海报生成组件封装

    每个小程序成型后,一般都会选择生成带菊花码的海报分享出去来吸引更多的流量.下面来介绍下其他的一种实现方式吧 原理:主要利用微信小程序强大的Canvas API来合成,生成后可用wx.canvasToT ...

  2. 微信小程序 - 富文本图片宽度自适应(正则)

    引言:在微信小程序里,比如商品展示页面的商品详情会有图片展示,PC端设置的商品详情是PC端的宽度,所以在小程序里图片会显示不全,这时就应该做相应的处理,使小程序里图片显示正确 思路 把图片的宽度改为手 ...

  3. 基于支付宝小程序合成海报

    合成海报是活动.商品分享中比较常用的功能.之前在微信小程序中经常实现,最近由于项目需要,在支付宝小程序中也实现了该功能.实现流程大同小异,但由于是两个生态的物种,所以也有个别地方需要注意,在此记录. ...

  4. JAVA生成微信小程序分享海报图片

    由于小程序里面分享产品,不能直接到朋友圈,因此很多系统的做法是生成一张带有二维码,或者小程序码的海报图片.用户保存到本地,然后分享到朋友圈. 生成海报,有两种方式: 前端小程通过 canvs 绘图到模 ...

  5. uni-app微信小程序合成海报并保存到相册

    页面有三部分的图片.logo.二维码和背景图.其中背景图是本地的. logo和二维码是接口给的. 像这样的海报合成的例子我写过一篇,是在vue的项目中的vue把几张图片logo.二维码.背景合成一个海 ...

  6. 微信小程序 滚动选项卡 swiper高度自适应

    最近做小程序的时候遇到了swiper高度的问题,swiper里面的内容可以根据数据来自适应高度.那就给scroll-view计算一下高度 wxml <view class="conta ...

  7. flex解决微信小程序ScrollView等组件高度自适应

    小程序页面开发时经常需要用的scroll-view 和 swiper这两个组件,官方文档显示这两个组件需要设置固定的高度才好用. 当数据列表高度不确定的时候,一开始我是对scroll-view或者sw ...

  8. 微信小程序合成海报_微信小程序 canvas生成海报图片模糊问题

    一.制作正常显示海报,生成二倍海报隐藏 代码如下 {{sendName}} 保存图片 /*css*/ .btn { width: 300rpx; height: 90rpx; line-height: ...

  9. 微信小程序富文本图片宽度自适应以及文字自动换行等解决方法

    let content = res.content // 后台返回的富文本值 content = content.replace(/;\swidth\s:\s*/g, ';max-width:100% ...

最新文章

  1. 用数据品鉴咖啡,407杯咖啡数据教你如何区分咖啡等级和风味
  2. css清除浮动的处理方法
  3. 题目1182:统计单词
  4. Open-E DSS V7 应用系列之三 Web管理简介
  5. Redis:安装、配置、操作和简单代码实例(C语言Client端)[转]
  6. 安装JDK-- Java基础
  7. asp.net连oracle数据库,ASP.NET连接Oracle数据库的步骤详解(转)
  8. DMA(2) S3C2410 DMA详解(其它的其实类似)
  9. Processing编程学习指南1.5 颜色透明度
  10. POJ1050-To the Max
  11. python中关于正则表达式二
  12. Bailian2700 字符替换【字符串】
  13. dontshrink解决ProGuard错误:java.lang.StackOverflowError
  14. 2019全球区块链杭州高峰论坛将于5月17日举办!
  15. linux uvc协议_linux 使用 uvc 摄像头
  16. 高数篇:高等数学全目录
  17. 安装alexa工具条报毒
  18. pyton人值得拥有
  19. windows下Git连接使用
  20. python编写年金现值计算函数_养老金中的钱是怎么算出来的?

热门文章

  1. 自动化持续集成_为人民自动化,选择持续集成服务器
  2. 仿真时间`timescale 1ns/1ps 的定义 延迟赋值与阻塞赋值非阻塞赋值的一个小问题
  3. SecureFX中文乱码终极解决方案
  4. python3群控手机_带你用 Python 实现自动化群控设备
  5. LearningSpark(5):Spark共享变量理解
  6. html前端小教程—各浏览器兼容视频插入方法
  7. 刷脸支付开拓创走在时代的前沿
  8. Python装饰器最经典教程,以最易理解的方式教会你
  9. ATmega16开发板教程(4)——定时器
  10. Kaggle之泰坦尼克号(1)