利用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 相关文章推荐
VML绘图板②脚本--VMLgraph.js、XMLtool.js
Oct 09 PHP
PHP 七大优势分析
Jun 23 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
Nov 01 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
Jun 06 PHP
Codeigniter操作数据库表的优化写法总结
Jun 12 PHP
从零开始学YII2框架(六)高级应用程序模板
Aug 20 PHP
PHP实现的简易版图片相似度比较
Jan 07 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
Jul 08 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
Apr 11 PHP
浅谈laravel中的关联查询with的问题
Oct 10 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 PHP
为你的 Laravel 验证器加上多验证场景的实现
Apr 07 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
PHP概述.
2006/10/09 PHP
域名查询代码公布
2006/10/09 PHP
浅析关于PHP位运算的简单权限设计
2013/06/30 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
jQuery 性能优化指南(2)
2009/05/21 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
jquery检测input checked 控件是否被选中的方法
2014/03/26 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
ndm:NPM的桌面GUI应用程序
2018/10/15 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
python 实现&quot;神经衰弱&quot;翻牌游戏
2020/11/09 Python
北大研究生linux应用求职信
2013/10/29 职场文书
教师岗位职责
2013/11/17 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
餐饮采购员岗位职责
2014/03/15 职场文书
2014年库房工作总结
2014/11/26 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
初中政治教学工作总结
2015/08/13 职场文书
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers
cypress测试本地web应用
2022/06/01 Javascript