项目的一些说明:

  • 我们在做一个汉字的项目,在这个项目中我们需要使用ps不停的制作一种图片;
  • 而图片样式基本固定。每次制作都需要设计人员重复排版,不停调整图片和文字间隔和大小;
  • 这样的事如果做一两次还是可以忍受的,可是每天都为这个花费大量的时间,就太折磨人了;
  • 精通php的老板一看,觉得这个用php就可以解决,于是他就把这活交给了我,通过php自动生成一张样式统一的卡片,用来减轻设计小女孩的工作量,把她从不停的排版中解除出来(可是我一点不懂php啊,我是做Android的,没关系,不会我们可以学习嘛。哈哈~~);
  • 就这样这个任务落到了公司除老板意外唯一懂技术的我的肩膀上了;
  • 来让我们看看是什么样样子的一个卡片呢?

项目制作的卡片如下图:

[图片上传失败...(image-a2974c-1511782668998)]

由图可以看出,整个大图由小的图片和文字组成。由于文字的多少是不确定的,每次的解释长短不一样,所以我们用程序画图的时候,要动态的根据文字的长短,个数,计算出文字占用的高度。

我们使用imagettftext这个函数把文字绘制在图片上,可是问来了,我们要解决换行问题,还要解决行间距的问题。如果我们单纯的插入\n作为换行符,会发现,行间距几乎为零,很难看。

下面是自己写了一个换行算法,并且可以设置行高同时,可以返回文字占用的高度。也想办法拍出来,标点符号出现在句首的问题。

下面附上“自动换行”和“计算段落高”的算法,执行后悔直接绘制。:

//下面函数方法我是这样调用的,这里是用来测量高度的。$temp = array("color" => array(99, 99, 99), "fontsize" =>27, "width" => 496, "left" => 100, "top" => 0, "hang_size" => 40);//这里我只用它做测量高度,把参数false改为true就是绘制了。$str_h=draw_txt_to($im, $temp, $str, false);//----------分割线------------/*** 文字自动换行算法* @param $card 画板* @param $pos 数组,top距离画板顶端的距离,fontsize文字的大小,width宽度,left距离左边的距离,hang_size行高* @param $str 要写的字符串* @param $iswrite  是否输出,ture,  花出文字,false只计算占用的高度* @return int 返回整个字符所占用的高度*/function draw_txt_to($card, $pos, $str, $iswrite)
{$_str_h = $pos["top"];$fontsize = $pos["fontsize"];$width = $pos["width"];$margin_lift = $pos["left"];$hang_size = $pos["hang_size"];$temp_string = "";$font_file = "./Fonts/华文细黑.ttf";$tp = 0;$font_color = imagecolorallocate($card, $pos["color"][0], $pos["color"][1], $pos["color"][2]);for ($i = 0; $i < mb_strlen($str); $i++) {$box = imagettfbbox($fontsize, 0, $font_file, $temp_string);$_string_length = $box[2] - $box[0];$temptext = mb_substr($str, $i, 1);$temp = imagettfbbox($fontsize, 0, $font_file, $temptext);if ($_string_length + $temp[2] - $temp[0] < $width) {//长度不够,字数不够,需要//继续拼接字符串。$temp_string .= mb_substr($str, $i, 1);if ($i == mb_strlen($str) - 1) {//是不是最后半行。不满一行的情况$_str_h += $hang_size;//计算整个文字换行后的高度。$tp++;//行数if ($iswrite) {//是否需要写入,核心绘制函数imagettftext($card, $fontsize, 0, $margin_lift, $_str_h, $font_color, $font_file, $temp_string);}}} else {//一行的字数够了,长度够了。//            打印输出,对字符串零时字符串置null$texts = mb_substr($str, $i, 1);//零时行的开头第一个字。//            判断默认第一个字符是不是符号;$isfuhao = preg_match("/[\\\\pP]/u", $texts) ? true : false;//一行的开头这个字符,是不是标点符号if ($isfuhao) {//如果是标点符号,则添加在第一行的结尾$temp_string .= $texts;//                判断如果是连续两个字符出现,并且两个丢失必须放在句末尾的,单独处理$f = mb_substr($str, $i + 1, 1);$fh = preg_match("/[\\\\pP]/u", $f) ? true : false;if ($fh) {$temp_string .= $f;$i++;}} else {$i--;}$tmp_str_len = mb_strlen($temp_string);$s = mb_substr($temp_string, $tmp_str_len-1, 1);//取零时字符串最后一位字符if (is_firstfuhao($s)) {//判断零时字符串的最后一个字符是不是可以放在见面//讲最后一个字符用“_”代替。指针前移动一位。重新取被替换的字符。$temp_string=rtrim($temp_string,$s);$i--;}
//            }//            计算行高,和行数。$_str_h += $hang_size;$tp++;if ($iswrite) {imagettftext($card, $fontsize, 0, $margin_lift, $_str_h, $font_color, $font_file, $temp_string);}
//           写完了改行,置null该行的临时字符串。$temp_string = "";}}return $tp * $hang_size;}function is_firstfuhao($str)
{$fuhaos = array("\\"", "“", "'", "<", "《",);return in_array($str, $fuhaos);}

这样我们的汉字换行绘制输出,和测量高度的问题就解决了。虽然算法不完美,可是时间有限的情况下,基本能满足了我们的需求。

Github地址:https://github.com/SaudM/PhpCard

侵权联系删除

作者:小追兵
链接:https://www.jianshu.com/p/f339fc8d006c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

用PHP的imagettftext绘制文字的换行问题相关推荐

  1. canvas绘制的文字如何换行

    <html><head><title>canvas绘制的文字如何换行</title><style type="text/css" ...

  2. 【Qt】2D绘图之绘制文字

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 基本绘制 04. 使用范围绘制文字 05. 使用字体绘制文字 06. 附录 01. 概述 Qt中除了绘制图形以外,还可以使 ...

  3. [Qt教程] 第13篇 2D绘图(三)绘制文字

    [Qt教程] 第13篇 2D绘图(三)绘制文字 楼主  发表于 2013-4-25 23:04:46 | 查看: 720| 回复: 0 绘制文字 版权声明 该文章原创于Qter开源社区,作者yafei ...

  4. 给图片添加文字(换行)水印

    Android给图片添加半透明背景的水印 (水印带有半透明底色) 给图片添加文字(换行)水印 1.绘制富文本: /** * 绘制富文本* StaticLayout可实现换行* <p>* h ...

  5. 微信php echo换行,微信小程序文字显示换行问题

    微信小程序文字显示换行问题 小程序文字显示换行 问题 用户在上传图文时,输入换行符.导致我在拿到数据后JSON.parse的时候报错. 大概这样的结构: [{ text:'落魄前端 在线炒粉!!!' ...

  6. 【Qt入门第13篇】 2D绘图(三)绘制文字

    导语 Qt中除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::fontI ...

  7. Java实现在线word文档添加铺满效果文字水印,文字可换行

    Java实现在线word文档添加铺满效果文字水印,文字可换行 使用插件Aspose.words for java 生成水印的工具类 调用生成水印方法 需求:为在线预览的word文档添加自定义水印,还要 ...

  8. CAD交互绘制文字(网页版)

    1.在CAD设计时,需要绘制文字,用户可以设置设置绘制文字的高度等属性. 2.主要用到函数说明:_DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOUBLE dP ...

  9. opengl绘制文字

    转自网摘 http://www.cnblogs.com/mattins/p/4126298.html.没示例程序. 增加了两个文件,showline.c, showtext.c.分别为第二个和第三个示 ...

最新文章

  1. 数据库:SQL Server与MySQL
  2. 深度学习(二十四)矩阵分解之基于k-means的特征表达学习
  3. lftp压缩对方服务器文件,lftp 贴心好友 备份服务器bash脚本
  4. free网页服务器,Web网站服务(一)
  5. POJ 3268 Silver Cow Party (最短路径)
  6. 那个一年发四篇Cell的研究生,后来怎么样了?
  7. 4月1日,正式对全球科学界开放!
  8. geotools判断一个点是否在多边形上
  9. 21. 包含min函数的栈(C++版本)
  10. Ragel State Machine Compiler 的速度测试
  11. dwg文件怎么转换成pdf格式的文件?
  12. U盘拷贝时提示文件过大
  13. Libero_SoC_v12.2_win软件及License下载安装教程 转
  14. CTF|pwn栈溢出入门题level3解题思路及个人总结
  15. 小学数学与计算机整合课优质教案,小学数学优质课教案《长方形的面积》(通用5篇)...
  16. 苹果、谷歌、脸书等公司该怎样分配股权?
  17. 打印准考证没电脑怎么办
  18. 传统向量空间模型的缺陷
  19. Lattice系列FPGA入门相关1(Lattice系列FPGA简介)
  20. matlab检验协方差阵是否相等,matlab协方差矩阵

热门文章

  1. 机械键盘 程序员_适用于程序员和游戏玩家的机械键盘
  2. JAVA 微信小程序AES解密数据 demo
  3. js 字符串替换的坑(v1)
  4. 南京邮电大学c语言实验报告5,南京邮电大学C语言大一上期末复习.pdf
  5. windows bat脚本学习一(基础指令)
  6. 微信小程序跳转方式总结
  7. 微软小冰 3.0:有视力,有声音,人工智能已离你越来越近
  8. LVM(逻辑卷管理器)
  9. 动图ps在html不动了,PS修改了GIF动态图文字点了播放还是不动怎么回事?如何解决?...
  10. 梦塔防手游怎么用电脑玩 梦塔防手游模拟器教程