利用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 相关文章推荐
给初学者的30条PHP最佳实践(荒野无灯)
Aug 02 PHP
PHP中使用mktime获取时间戳的一个黑色幽默分析
May 31 PHP
PHP 获取文件路径(灵活应用__FILE__)
Feb 15 PHP
探讨:如何使用PhpDocumentor生成文档
Jun 25 PHP
在PHP中运行Linux命令并启动SSH服务的例子
Jun 12 PHP
php操作memcache缓存方法分享
Jun 03 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
Jun 10 PHP
详解PHP实现异步调用的4种方法
Mar 14 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
Jul 07 PHP
thinkPHP实现签到功能的方法
Mar 15 PHP
Laravel向公共模板赋值方法总结
Jun 25 PHP
Laravel validate error处理,ajax,json示例
Oct 25 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
php抓即时股票信息
2006/10/09 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
基于php+MySql实现学生信息管理系统实例
2020/08/04 PHP
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
用于deeplink的js方法(判断手机是否安装app)
2014/04/02 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
2015/02/03 Javascript
JS实现控制表格单元格垂直对齐的方法
2015/03/30 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
2018/05/22 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
在layui.use 中自定义 function 的正确方法
2019/09/16 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
vue实现移动端触屏拖拽功能
2020/08/21 Javascript
python绘制立方体的方法
2018/07/02 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
python实现按关键字筛选日志文件
2019/12/24 Python
Tensorflow 卷积的梯度反向传播过程
2020/02/10 Python
python 监控logcat关键字功能
2020/09/04 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
NEW LOOK官网:英国时装零售巨头之一,快时尚品牌
2017/01/11 全球购物
adidas菲律宾官网:adidas PH
2020/02/07 全球购物
介绍一下如何利用路径遍历进行攻击及如何防范
2014/01/19 面试题
大学生就业推荐信范文
2013/11/29 职场文书
大型活动策划方案
2014/01/12 职场文书
党员违纪检讨书
2014/02/18 职场文书
承租经营合作者协议书
2014/10/01 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
三人合伙协议书范本
2014/10/29 职场文书
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android