怎么使用PHP在图片上覆盖文字

管理员 发布于 4年前   637

怎么使用PHP在图片上覆盖文字


这是一个简单的PHP脚本,带有一些可以直接在命令行中运行的假设。可以轻松调整它以满足其他更复杂的要求,例如水印图像,针对移动设备优化的图像,从Google Spreadsheets或Airtable中读取数据等,因此您可以随意分叉存储库或下载源代码并根据需要对其进行破解。


首先,使用一些变量,这样我们就可以调整脚本行为,而不必弄清楚代码在哪里进行设置

$ csv_file ='names.csv';
$ background ='background.jpg';
$ signature ='sig.png';
$ font ='ConeriaScript.ttf';

然后,我们读取并解析了CSV文件,因此通过将其转换为以列名作为键的关联数组,以后更易于阅读。

//来自https://www.php.net/manual/zh/function.str-getcsv.php的CSV代码

$csv = array_map('str_getcsv', file($csv_file));
array_walk($csv, function (&$a) use ($csv) {
   $a = array_combine($csv[0], $a);
});
array_shift($csv);

对于此特定背景,我们需要将当前日期作为三个字符串放置在三个不同的位置。

$ day = date('j');
$ month = date('F');
$ year = date('Y');

现在我们开始玩PHP的图像功能。首先,我们需要阅读背景图像以获取一些基本信息并进行一些准备,例如设置文本颜色,图像宽度(用于居中放置文本)以及读取签名图像及其尺寸。

$ image = imagecreatefromjpeg($ background);
$ color = imagecolorallocate($ image,0,0,0);
$ width = imagesx($ image);
$ signature = imagecreatefrompng($ signature);
$ signature_width = imagesx($ signature);
$ signature_height = imagesy($ signature);

现在我们已经准备好图像数据,我们将开始读取列表中的每个名称,以便我们可以生成带有所有覆盖文字的单个图像。为了便于阅读,我将名称和原因保存在自己的变量中。

foreach($ csv为$ row){
   $ name = $ row ['Name'];
   $ reason = $ row ['Reason'];

在这里,我正在重新阅读背景图片。对于循环中的第一项,这是没有意义的,因为我已经在上面阅读过,但是由于所有image *函数都更改了它们的输入,因此,如果不这样做,我将结束列表中的所有图像,将结束所有先前的图像。来自所有先前图像的文本重叠;不好。我还得到了文本“装订框”,它们基本上是文本四个角的位置;我这样做是为了使文本在图像中居中。

 $ image = imagecreatefromjpeg($ background);
   $ name_box = imagettfbbox(40,0,$ font,$ name);
   $ reason_box = imagettfbbox(40,0,$ font,$ reason);

现在是时候在图像上实际渲染文本了。这是通过向PHP提供一些信息来完成的,包括目标图像,文本大小,角度,x和y位置,颜色,字体(是的,您可以使用字体!),最后但并非最不重要的是实际文本。

imagettftext($image, 40, 0, ($width - $name_box[2]) / 2, 635, $color, $font, $name);
   imagettftext($image, 40, 0, ($width - $reason_box[2]) / 2, 790, $color, $font, $reason);
   imagettftext($image, 32, 0, 400, 895, $color, $font, $day);
   imagettftext($image, 32, 0, 600, 895, $color, $font, $month);
   imagettftext($image, 32, 0, 600, 975, $color, $font, $year);

正确覆盖文本后,我需要在文本顶部添加“签名”图像,以使其看起来更好,因此我告诉PHP在顶部复制签名图像(透明的PNG文件),如您所见,不仅要提供位置,还要提供尺寸。

 imagecopy($ image,$ signature,400,980,0,0,$ signature_width,$ signature_height);

差不多了!在这里,我通过提供名称将结果图像保存到磁盘。我没有提供名称,PHP只会输出内容,也可以通过提供正确的标头将其用作下载链接。

imagejpeg($ image,“ diplomas / $ name.jpg”);

完成图像处理,它就会被销毁。

imagedestroy($ image);

希望能帮到你

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

该博客于2020-12-7日,后端基于go语言的beego框架开发
前端页面使用Bootstrap可视化布局系统自动生成

是我仿的原来我的TP5框架写的博客,比较粗糙,底下是入口
侯体宗的博客

      订阅博客周刊

文章标签

友情链接

HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群
侯体宗的博客