利用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 相关文章推荐
PHP&amp;MYSQL服务器配置说明
Oct 09 PHP
SMARTY学习手记
Jan 04 PHP
PHP中用header图片地址 简单隐藏图片源地址
Apr 09 PHP
一周让你学会PHP 不错的学习资料
Feb 06 PHP
php Xdebug 调试扩展的安装与使用.
Mar 13 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
WIFI万能钥匙密码查询接口实例
Sep 28 PHP
PHP不使用内置函数实现字符串转整型的方法示例
Jul 03 PHP
thinkphp中的多表关联查询的实例详解
Oct 12 PHP
Laravel-admin之修改操作日志的方法
Sep 30 PHP
PHP执行linux命令6个函数代码实例
Nov 24 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
Dec 30 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
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
PHP读取PPT文件的方法
2015/12/10 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
PHP基本语法实例总结
2016/09/09 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
运算符&amp;&amp;的三个不同层次
2013/04/07 Javascript
写得不错的jquery table鼠标经过变色代码
2013/09/27 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
分分钟玩转Vue.js组件
2016/10/25 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
node通过express搭建自己的服务器
2017/09/30 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
微信小程序文章列表功能完整实例
2020/06/03 Javascript
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
Python访问纯真IP数据库脚本分享
2015/06/29 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
pandas 透视表中文字段排序方法
2018/11/16 Python
Python魔术方法专题
2020/06/19 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
暇步士官网:Hush Puppies
2016/09/22 全球购物
手机配件第一品牌:ZAGG
2017/05/28 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
介绍一下Linux文件的记录形式
2013/09/29 面试题
航空大学应届生求职信
2013/11/10 职场文书
大学生专科毕业生自我评价
2013/11/17 职场文书
2014年保洁工作总结
2014/11/24 职场文书
公司档案管理制度
2015/08/05 职场文书