利用PHP自动生成印有用户信息的名片


Posted in PHP onAugust 01, 2016

前言

无论是自己要在精心P过的自拍上添加个性文字,或者是摄影爱好者要在拍摄的作品里添加水印,亦或是在网页或者移动应用中实时生成文字和图片的组合,我们都需要找到一个合适且靠谱的方法来将图片和文字完美的结合在一起。

所以,“最好的编程语言”PHP及其GD库就给我们提供了这样一套简单且高效的解决方案。

我知道,这时候有个实例才是最好的~ 下面就让我来举个简单的栗子!

目标

将用户在网页应用中输入的个人信息与图片结合,生成一张印有用户信息的名片。

效果

1 预设一张图片,作为名片背景

利用PHP自动生成印有用户信息的名片
名片背景

2 用户信息输入

利用PHP自动生成印有用户信息的名片
信息输入

3 名片生成(点击Continue之后)

利用PHP自动生成印有用户信息的名片
名片生成

步骤

在一切开始之前,请使用phpinfo() command来确认GD库已安装。

首先,我们要做的事情很简单,新建一个PHP文件,就叫它main.php吧。

在main.php中,理论上我们需要以下几行代码(本代码基于CakePHP 3):

<?php
//创建一个表单提供用户输入功能
echo $this->Form->create();

//只保留value属性,其他属性已省略
echo $this->Form->input(
'First Name',['value' => $firstname, '...' => '...', ...]);
echo $this->Form->input(
'Last Name',['value' => $lastname, '...' => '...', ...]);
echo $this->Form->input(
'City',['value' => $city, '...' => '...', ...]);
echo $this->Form->input(
'State',['value' => $state, '...' => '...', ...]);

/*
* 将img标签指向一个叫做image.php的PHP文件。 
* 所有的用户输入信息将以URL的形式保存在img标签的src属性中, 
* 在表格提交后即可被image.php通过GET获取。
* 所有变量已通过PHP自带strtoupper函数转换为大写。
*/
echo $this->Html->image("image.php?first=".strtoupper($firstname)."&last=".strtoupper($lastname).
"&location=".strtoupper($city)." ".strtoupper($state), ['fullBase' => true]);
/*
* 上面的代码相当于:
* <img src="image.php?first=名&last=姓&location=城市" />
*/

//表单提交
echo $this->Form->button('CONTINUE', ['type' => 'submit']); 

//关闭表单
$this->Form->end();

接下来,就是创建Where amazing happens的image.php了。包括图片设置,获取用户信息,将文字信息添加到图片上,所有的一切都将在这一步完成。

让我们通过代码来一探究竟吧。

<?php
// header() 函数向客户端发送原始的 HTTP 报头。
header('Content-type: image/jpeg');

// 由文件或 URL 创建一个新图象,这里的text.jpg就是效果1显示的预设图片
$rImg = ImageCreateFromJPEG("test.jpg"); 

// 为一幅图像分配颜色
$cor = imagecolorallocate($rImg, 0, 0, 0);

// 我们可以自定义与图片结合的文字字体
$font = "./arial.ttf";

// 设置最终生成图片的宽度以及文字相对于图片所在的高度
$imgWidthSetting = 676;
$textHeightOffset = 220;

// 解码main.php里img标签已编码的URL字符串,包括first, last以及location
$first = urldecode($_GET['first']);
$last = urldecode($_GET['last']);
$location = urldecode($_GET['location']);

/*
* 取得需要向图片上添加的文本的范围。imagettfbbox() 返回一个含有8个
* 单元的数组表示了文本外框的四个角。
*/
$width_first = imagettfbbox(60, 0, $font, $first);
$width_last = imagettfbbox(70, 0, $font, $last);
$width_location = imagettfbbox(35, 0, $font, $location);

// 进一法取整, $width_变量[2]代表右下角X坐标位置
$x_first = ceil($imgWidthSetting - $width_first[2]);
$x_last = ceil($imgWidthSetting - $width_last[2]); 
$x_location = ceil($imgWidthSetting - $width_location[2]);

// 利用imagettftext()函数将文本“写入”图像
imagettftext($rImg, 60, 0, $x_first, $textHeightOffset+120, $cor, $font, $first);
imagettftext($rImg, 70, 0, $x_last, $textHeightOffset+210, $cor, $font, $last);
imagettftext($rImg, 35, 0, $x_location, $textHeightOffset+290, $cor, $font, $location);

// 输出图象到浏览器或文件,quality 为可选项,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)
imagejpeg($rImg,NULL,100); 

// Free up memory, imagedestroy() 释放与 image 关联的内存。
imagedestroy($rImg);

到这里,我们就完成了通过PHP把文字添加到图片上的所有步骤。当用户输入个人信息并提交表单后,通过image.php,效果3的名片就会自动生成。

总结

利用PHP将文字与图片结合虽然简单,但可以衍生出很多不同的应用方法。譬如,我们可以将名片背景及生成的名片隐藏起来,只对用户显示信息输入界面。同时,我们在代码中接入打印机的API。这样,当用户输入完自己的信息点击继续之后,显示着用户信息的名片就会直接打印出来。这很适用于用户参加线下聚会活动check in时的场景。

总之,PHP作为“最好的编程语言”,编码不统一,性能遭诟病,语法不严谨。的确,PHP的槽点太多,足够我们黑三天三夜。但我们又必须承认,PHP及其庞大的内置函数库为网页开发者们提供了便捷且强有力的工具。你看,简单的几个函数,就可以完美实现文字与图片的结合,所以PHP还是有很多人支持的。希望本文对大家学习PHP有所帮助。

PHP 相关文章推荐
windows xp下安装pear
Dec 02 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
May 18 PHP
php数字游戏 计算24算法
Jun 10 PHP
php数组中删除元素的实现代码
Jun 22 PHP
解析如何在PHP下载文件名中解决乱码的问题
Jun 20 PHP
使用PHP静态变量当缓存的方法
Nov 13 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
May 08 PHP
PHP开发框架Laravel数据库操作方法总结
Sep 03 PHP
PHP从FLV文件获取视频预览图的方法
Mar 12 PHP
Windows下php+mysql5.7配置教程
May 16 PHP
php读取本地json文件的实例
Mar 07 PHP
php实现QQ小程序发送模板消息功能
Sep 18 PHP
php+ajax登录跳转登录实现思路
Jul 31 #PHP
nginx下安装php7+php5
Jul 31 #PHP
header与缓冲区之间的深层次分析
Jul 30 #PHP
laravel学习教程之关联模型
Jul 30 #PHP
laravel学习教程之存取器
Jul 30 #PHP
thinkphp表单上传文件并将文件路径保存到数据库中
Jul 28 #PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 #PHP
You might like
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
Javascript中replace()小结
2015/09/30 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
2016/10/05 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
2020/11/30 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
JS温故而知新之变量提升和时间死区
2019/01/27 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
2020/02/01 jQuery
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
Python中list查询及所需时间计算操作示例
2018/06/21 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
pytorch 中forward 的用法与解释说明
2021/02/26 Python
优秀的教师个人的中文求职信
2013/09/21 职场文书
儿科主治医生个人求职信
2013/09/23 职场文书
法学毕业生自我鉴定
2014/01/31 职场文书
中班教师个人总结
2015/02/05 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
表扬信范文
2015/05/04 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
花木兰观后感
2015/06/10 职场文书
安全生产感想
2015/08/07 职场文书
投资入股协议书
2016/03/22 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android