利用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 网页游戏开发入门教程一(webgame+design)
Oct 26 PHP
PHP数组内存耗用太多问题的解决方法
Apr 05 PHP
PHP setTime 设置当前时间的代码
Aug 27 PHP
php使用正则过滤js脚本代码实例
May 10 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
Sep 06 PHP
PHP中字符安全过滤函数使用小结
Feb 25 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
Mar 25 PHP
YII框架http缓存操作示例
Apr 29 PHP
thinkPHP5.1框架中Request类四种调用方式示例
Aug 03 PHP
PHP判断当前使用的是什么浏览器(推荐)
Oct 27 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 PHP
tp5.1 框架join方法用法实例分析
May 26 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
晶体管单管来复再生式收音机
2021/03/02 无线电
php adodb介绍
2009/03/19 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
PHP用反撇号执行外部命令
2015/04/14 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
Javascript 键盘keyCode键码值表
2009/12/24 Javascript
jQuery动态添加的元素绑定事件处理函数代码
2011/08/02 Javascript
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
js实现拖拽效果(构造函数)
2015/12/14 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
AngularJs 指令详解及示例代码
2016/09/01 Javascript
Bootstrap轮播插件使用代码
2016/10/11 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
vue实现分页加载效果
2019/12/24 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
Python实现壁纸下载与轮换
2020/10/19 Python
10个示例带你掌握python中的元组
2020/11/23 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
Python实现区域填充的示例代码
2021/02/03 Python
销售找工作求职信
2013/12/20 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
Python数据类型最全知识总结
2021/05/31 Python
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server