本文可以帮助你解决一下问题:

1,GD库添加文字水印无法换行

2,GD库添加文本实现居中显示

3,stil/gd-text扩展包添加文字为中文时,换行失效

GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片,也可以给图片加水印。我们常用它生成网址验证码,图片缩略图,分享海报等等。

一,前置条件

1,确保你的PHP安装了GD扩展,并在php.ini启用了该扩展

2,phpinfo()查看GD扩展已开启:

image.png

3,以下每段代码快最后三句均为调试代码,用以在浏览器查看当前图片。所有代码块连接在一起时,需要去除调试代码

二,创建一幅图片(画布)

//1,添加一个画布$img,同时给这个画布添加背景图片$bg

$bgPath = './images/bg.jpg';

$bgInfo = getimagesize($bgPath);

$bgFun = 'imagecreatefrom'.image_type_to_extension($bgInfo[2], false);

//创建一个图: 460*830

$bg = $bgFun($bgPath);

$bgWidth = imagesx($bg); //背景宽度

$bgHeight = imagesy($bg); //背景高度

$img = imageCreatetruecolor($bgWidth,$bgHeight);

$color = imagecolorallocate($img, 0, 0, 0);

imagefill($img, 0, 0, $color);

//平滑的拷贝背景图到$img

imagecopyresampled($img,$bg,0,0,0,0,imagesx($bg),imagesy($bg),imagesx($bg),imagesy($bg));

//打印查看:

header('Content-Type: image/png;charset=UTF-8');//必须声明

imagepng($img);

exit;

三,为图片添加水印

//2,使用GD库在一张图片上面加文字:

$font = realpath("./font/simhei.ttf");

//显示的文字

$text = "A class drawing multiline and aligned text on pictures";

//设置字体颜色

$black = imagecolorallocate($img, 65, 65, 65);

//将ttf文字写到图片中

imagettftext($img, 16, 0, 52, 170, $black, $font, $text);

//打印查看:

header('Content-Type: image/png;charset=UTF-8');//必须声明

imagepng($img);

exit;

image.png

可以看到,当文本超长时,直接被截断了,超出图片宽度的文字直接不可见。事实上,使用GD库为图片添加文字水印,它是不处理文本长度的。我们可以理解GD库只处理图片有多少个像素组成,图片长宽多少,每一个像素点A(x,y)是什么颜色。

但是我们动态生成的图片,不确定性太多,例如用户昵称,用户签名,商品名称等等这些长度都不确定,造成了我们生成的图片的文本长度不确定,如果文本超出了,那么我们需要怎样去处理超长的文本呢?

答案是,自己去处理,通过自己设置的字体大小,图片的宽度,计算出多少个字之后,就会被截断,在截断之前自己生成新的字符串写在第二行上面。

关键函数:

$box = imagettfbbox ( 20, 0,$font, $ccv );

根据 $box 提供的信息适当裁剪 $ccv 使之可以放下

但是人生苦短,研究技术的小伙伴可以自己去搞一搞,但是打工人时间紧任务重,gd-text这个包已经帮我们封装好了我们想要的东西,就不建议重复造轮子了,我们直接使用。

它的使用方法类似于我们在PPT上面添加一个文本框一样:给它一个左上角坐标A(x,y),宽度,高度。一个文本框就形成了,那我们在这个框里面写东西,超出的文字就会自动换行。是不是非常方便

1,安装:使用composer安装:

composer require stil/gd-text

2,使用:

require __DIR__.'./vendor/autoload.php';

use GDText\Box;

use GDText\Color;

//1,添加一个画布$img,同时给这个画布添加背景图片$bg

$bgPath = './images/bg.jpg';

$bgInfo = getimagesize($bgPath);

$bgFun = 'imagecreatefrom'.image_type_to_extension($bgInfo[2], false);

//创建一个图: 460*830

$bg = $bgFun($bgPath);

$bgWidth = imagesx($bg); //背景宽度

$bgHeight = imagesy($bg); //背景高度

$img = imageCreatetruecolor($bgWidth,$bgHeight);

$color = imagecolorallocate($img, 0, 0, 0);

imagefill($img, 0, 0, $color);

//平滑的拷贝背景图到$img

imagecopyresampled($img,$bg,0,0,0,0,imagesx($bg),imagesy($bg),imagesx($bg),imagesy($bg));

//3,使用gd-text包来为图片添加文字:

$box = new Box($img);

$font = realpath("./font/simhei.ttf");

//显示的文字

$text = "A class drawing multiline and aligned text on pictures";

$box->setFontFace($font);

$box->setFontColor(new Color(77, 77, 77));//字体颜色

$box->setFontSize(18);//字体大小

$box->setLineHeight(1.5);//行高

//下面为关键函数:画一个文本框:

$box->setBox(52, 200, 370, 200);//文本框起始点(x,y),长宽

//第一个参数设置水平:靠左-left,居中-center,靠右-right;第二个参数设置垂直:靠左-left,居中-center,靠右-right

$box->setTextAlign('left', 'top');

$box->draw($text);

//再画一个,这个是水平居中对齐的文本框:

$box->setBox(52, 380, 370, 200);

$box->setTextAlign('center', 'top');

$box->draw($text);

//打印查看:

header('Content-Type: image/png;charset=UTF-8');//必须声明

imagepng($img);

exit;

image.png

3,可以看到非常方便,但是当我们的传入的文本为中文时,奇怪的事情发生了,它并不能自动换行???(手动黑人问号脸)。网上没啥资料,自己看源代码了。

五,修改源代码

通过查看gd-text包的源码,我们可以发现,它是在src/Box.php里面的wrapTextWithOverflow()方法实现换行的。原来,当文本填满第一行时,它是通过空格拆分一串字符的,这很好理解,例如我们第一行八个单词排上去,还差3个字母,就要填满第一行了,而第九个单词(International)有13个字母,按照惯例我们不会把这个单词的前3个字母给拆掉的,而是整个单词都写在第二行去。所有,它内部是用explode()这个函数根据空格去拆单词,然后逐个计算在那里换行的。

但是我们的中文并不是每个字后面都有空格,explode()函数分隔符为必传,那怎么办呢?

1,自己在每个字后面加1个空格,这样就能自动换行。但是这样字距很大,并不美观。

2,str_split(string,length)函数,它可以分割字符串,第二个参数为分割后每个字符的长度。

但是分完后你会发现全是是乱码,因为中文一个字占三个字节,英文字母占一个字节;

那我当要插入中文的时候,用str_split(string,3)不就好了吗?当插入英文,就用explode();完美!

并不,很多时候我们都不敢保证一段就一定是英文或者是中文,它还有可能中文夹杂着英文,那这时候,依然是乱码。

这时候,还有其他办法吗?有,我们用强大的正则表达式

3,使用正则表达式

这个方法可以真正完全解决问题,下面我们开始修改源代码:

事实上我们是不建议直接改扩展包里面的源码的,这样不规范,但是现在先略过

1,在src/Box.php里面添加一个方法:

/**

* 拆分字符串为数组

* @param $str

* @author shaochao 2021/3/23 21:22

* @return array|false|string[]

*/

protected function mb_str_split($str){

return preg_split('/(?

}

2,修改wrapTextWithOverflow()方法,加多一个参数,用来判断用那种方法截取字符串:英文文本用空格;中文、中英混合文本用正则

/**

* Splits overflowing text into array of strings.

* @param string $text

* @return string[]

*/

protected function wrapTextWithOverflow($text,$isChinese = false)

{

$lines = array();

// Split text explicitly into lines by \n, \r\n and \r

$explicitLines = preg_split('/\n|\r\n?/', $text);

foreach ($explicitLines as $line) {

// Check every line if it needs to be wrapped

if($isChinese){

$words = $this->mb_str_split($line);

}else{

$words = explode(" ", $line);

}

$line = $words[0];

for ($i = 1; $i < count($words); $i++) {

$box = $this->calculateBox($line." ".$words[$i]);

if (($box[4]-$box[6]) >= $this->box['width']) {

$lines[] = $line;

$line = $words[$i];

} else {

$line .= $words[$i];

}

}

$lines[] = $line;

}

return $lines;

}

3,修改draw()方法,加多一个参数,用来判断用那种方法截取字符串:英文文本用空格;中文、中英混合文本用正则

/**

* Draws the text on the picture.

* @param string $text Text to draw. May contain newline characters.

*/

public function draw($text,$isChinese = false)

{

if (!isset($this->fontFace)) {

throw new \InvalidArgumentException('No path to font file has been specified.');

}

switch ($this->textWrapping) {

case TextWrapping::NoWrap:

$lines = array($text);

break;

case TextWrapping::WrapWithOverflow:

default:

$lines = $this->wrapTextWithOverflow($text,$isChinese);

break;

}

//只改上面这几行,该方法下面的代码维持不变

4,使用draw()方法的时候,遇到中文文本,我们第二个参数传true就可以了。

//4,使用gd-text包来添加一段中文文本:

$text2 = '你好,世界,学无止境。你好,世界,学无止境。你好,世界,学无止境。你好,世界,学无止境。你好,世界,学无止境。';

$box->setBox(52, 550, 370, 200);

$box->setTextAlign('left', 'top');

$box->draw($text2,true);

image.png

至此,使用GD库为图片添加文字且自动换行的分享到此结束,希望对你有所帮助。

下一次分享使用GD库动态生成分销海报

php怎么在图片上加文字居中,php GD库为图片添加文字且自动换行,水平居中相关推荐

  1. php 图片上加文字,php使用GD库实现图片上添加文字的方法(代码)

    本篇文章给大家带来的内容是关于php使用GD库实现图片上添加文字的方法(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我们可以利用php的gd库扩展来对我们的图片进行处理,例 ...

  2. php 背景图片上加载设备状态,PHP 将动态图片与固定背景图片合成并添加水印。...

    先放代码. public function mergeImage( $path_1, $path_2 ) { $img = imagecreatefromstring(file_get_content ...

  3. html字母上方加箭头,html5怎么在图片上加左右箭头

    html5怎么在图片上加左右箭头0 html5怎么在图片上加左右箭头 a[href]{font-size:25px;}a[href][id]{background-color:black;... ht ...

  4. 如何批量在图片上加二维码?

    二维码可以包含很多的信息,比如联系方式,个人简介等信息,所以很多小伙伴都想推广自己的二维码,所以有不少人将二维码加在图片上以达到更好的推广效果. 在图片上加二维码其实和在图片上加logo水印的方式是一 ...

  5. PHP 合成图片并在图片上加文字

    /*** Info: PHP把一张图片作为背景和另一张图片合成新图片*/public function createImage(){$path_1 = 'XXXXX/attachment/images ...

  6. 如何批量在图片上加统一的文字?

    工作中我们对图片的需求可谓是五花八门,比如批量在图片上加上相同的文字,相信不少小伙伴遇到过, 遇到这种情况的时候你一般会怎么处理呢?有些小伙伴会乖乖的用画图工具或PS软件一个一个添加,这样既不能做到统 ...

  7. iOS修改图片尺寸和裁剪功能以及 图片上加图片 图片加文字(水印效果)

    1.修改图片尺寸 - (  UIImage  *)imageWithImageSimple:(  UIImage  *)image scaledToSize:(  CGSize  )newSize { ...

  8. 在html中加入一个动态图,图片上加gif图片 图片某个角落贴个gif动态图,如何在静态图片上面加一张GIF动态图...

    喜欢上网的小伙伴就会知道网上流传灰常广泛一种搞笑gif动态图片,这类图片大部分是视频转gif的,就是截取视频经典搞笑画面制作而成,还加了些搞笑文字.使用网络聊天工具尤其是QQ就最常见了,那些搞笑的表情 ...

  9. Ubuntu下的opencv:在图片上加汉字和数字

    文章内容:本文主要介绍汉字的编码规则,并在ubuntu下调用opencv把汉字和数字叠加在图片上. 一.汉字编码 (一)区位码 在国标 GD2312-80 中规定,所有的国标汉字及符号分配在一个 94 ...

  10. php 用gd库在图片上写文字,并处理文字糊模问题

    今天有个需求,用php在一张图片上写文字. 这个不是挺简单的嘛?我在一个test.php文件上,敲出6行代码,搞定 img=imagecreatefrompng("C:\Users\Admi ...

最新文章

  1. Python机器学习入门资料整理
  2. 十、延时之基本知识介绍及实验
  3. 【数据结构】图的遍历(BFS和DFS)
  4. github上的优秀项目和开发环境配置【转http://www.cnblogs.com/2018/archive/2012/11/09/2763119.html】...
  5. Mind_Manager_2
  6. 协程学习-python
  7. HTML认识数字游戏,小班数学游戏教案《认识数字》
  8. 台达b2伺服说明书_工业4.03.0=?台达工业自动化新品告诉你答案
  9. DXperience 9.1.3
  10. JUCE复杂的命名空间的替代方法
  11. 玩转软件|通过汉化WINRAR,手把手教你如何汉化软件
  12. Ubuntu各版本代号
  13. Java8 Stream流 - 高效快速的处理集合
  14. c语言正弦波程序_怎样很好的恢复一个正弦波信号
  15. Troubleshooting: WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! (文档 ID 278316.1)
  16. [Poi2003 ][bzoj 2601]MAL猴子捞月
  17. 上海市青少年算法2021年9月月赛(丙组)
  18. ajax 中的contentType
  19. 基于XGBOOST的糖尿病遗传风险预测(1)
  20. FZU 2301 Chosen by god (组合数学+打表+快速幂)

热门文章

  1. 【emoji大全宝典】
  2. 语言代码 与地区(Android多语言)
  3. wpa_supplicant状态机
  4. Excel多个sheet导出pdf
  5. 写一篇本科/硕士毕业论文究竟需要看多少篇文献?
  6. electron快捷键
  7. 基于Luckysheet实现的协同编辑在线表格支持在线导入数据库,前端导出,前端导入,后端导出
  8. 百度地图根据位置获取对应的位置中文
  9. 大众点评字体解密(最新)2020/4/17
  10. 2021年四大流行Android手机自动化测试工具,全在这里了