利用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 定界符 使用技巧
Jun 14 PHP
PHP 柱状图实现代码
Dec 04 PHP
新浪微博API开发简介之用户授权(PHP基础篇)
Sep 25 PHP
深入PHP变量存储的详解
Jun 13 PHP
解析PHP生成静态html文件的三种方法
Jun 18 PHP
PHP中的流(streams)浅析
Jul 02 PHP
PHP的Socket网络编程入门指引
Aug 11 PHP
jquery+thinkphp实现跨域抓取数据的方法
Oct 15 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
phpfpm的作用和用法
Oct 10 PHP
在thinkphp5.0路径中实现去除index.php的方式
Oct 16 PHP
php7 参数、整形及字符串处理机制修改实例分析
May 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
Zerg基本策略
2020/03/14 星际争霸
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
详解php协程知识点
2018/09/21 PHP
Js 刷新框架页的代码
2010/04/13 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
html5 canvas js(数字时钟)实例代码
2013/12/23 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
老生常谈 关于JavaScript的类的继承
2016/06/24 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
vue 页面跳转的实现方式
2021/01/12 Vue.js
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
在Python下尝试多线程编程
2015/04/28 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
Python编程实现二叉树及七种遍历方法详解
2017/06/02 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
python logging设置level失败的解决方法
2020/02/19 Python
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
三好学生自我鉴定
2013/12/17 职场文书
2015年新教师工作总结
2015/04/28 职场文书
小学生节约用水倡议书
2019/08/12 职场文书
商业计划书之服装
2019/09/09 职场文书
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python
MySQL中varchar和char类型的区别
2021/11/17 MySQL
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python