如何使用PHP GD库生成海报
虽然PHP生成海报速度很慢而且各种编码问题十分让人头疼,但还是经常碰到需要生成海报的需求。
官网介绍
GD库有着丰富的方法供开发者调用,详细在PHP官网都能查询到。GD 和图像处理 函数
下载加载图片
官网提供了一系列方法加载各种格式图片,但我比较倾向直接用图片内容去加载,因为有时图片资源可能是网络资源直接获取偶尔会失败。
PHP获取图片内容可以用 curl 或者 file_get_contents()
测试了两种方法感觉curl获取网络资源比较合适,本地资源使用file_get_contents 获取。
这里我简单封装了一下CURL的操作。
function getCurl($url)
{
$ch = curl_init();
if (stripos($url, 'https://') !== false) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, false);
$content = curl_exec($ch);
curl_close($ch);
return $content;
}
可以获取图片内容后就可以将图片内容加载成GD资源,如下的代码是下载图片并加载图片到GD资源再保存到本地。
$imgUrl = 'http://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTKjMm8BLuicTicOTXCe2gLo0LoYbpxhWQtwSeIQ8NU1icbrnUBHHr9Iss8dYAuIHiaEZXSenPqRGgAcgQ/132';
// 获取图片内容
$imgContent = getCurl($imgUrl);
// 加载到图片资源
$imageSource = imagecreatefromstring($imgContent);
// 将图片资源保存成图片
$path = './head.jpg';
imagejpeg($imageSource, $path, 90);
// 销毁图片资源
imagedestroy($imageSource);
叠加图片
海报生成直接拿GD绘画的话难度很高,所以可以将一层一层画好的不同图片叠在一起来完成海报。
这里尝试生成一张灰色的背景并将头像按不同大小合成在背景上。
主要用到imagecopyresampled 方法来叠加两张图片,官网有很详细的说明。
// 灰色背景的尺寸
$boardWidth = 1080;
$boardHeight = 1080;
// 生成指定尺寸的图象
$boardSource = imagecreatetruecolor($boardWidth, $boardHeight);
// 图像分配个灰色,后面的参数是GRB
$gray = imagecolorallocate($boardSource, 222, 222, 222);
// 填充颜色,此时真正得到1080 * 1080 尺寸的灰色背景
imagefill($boardSource, 0, 0, $gray);
$imgUrl = 'http://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTKjMm8BLuicTicOTXCe2gLo0LoYbpxhWQtwSeIQ8NU1icbrnUBHHr9Iss8dYAuIHiaEZXSenPqRGgAcgQ/132';
// 获取头像内容
$imgContent = getCurl($imgUrl);
// 加载到图象资源
$imageSource = imagecreatefromstring($imgContent);
// 获取图象资源尺寸
list($imageWidth, $imageHeight) = getimagesizefromstring($imgContent);
// 将头像图片放到背景图片上
// 这里参数第一个是目标图象,第二个是源图象 这里分别是背景和头像
// 中间四个分别是坐标位置
// 最后四个分别是 目标的宽高 与 源图象的宽高
// 这里相当于把头像按不同大小合成在背景图上
imagecopyresampled($boardSource, $imageSource, 0, 0, 0, 0, $imageWidth / 2, $imageHeight / 2, $imageWidth, $imageHeight);
imagecopyresampled($boardSource, $imageSource, 150, 150, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
imagecopyresampled($boardSource, $imageSource, 400, 400, 0, 0, $imageWidth * 2, $imageHeight * 2, $imageWidth, $imageHeight);
// 将图片资源保存成图片
$path = './composite_picture.jpg';
imagejpeg($boardSource, $path, 90);
// 销毁图片资源
imagedestroy($boardSource);
imagedestroy($imageSource);
执行上面代码生成的图片是这样的:
文字处理
生成海报很有可能需要在图片上填写文字,如果不特意处理的话很可能生成的是乱码。
这里测试一下常见情况生成的结果:
// 背景的尺寸
$boardWidth = 400;
$boardHeight = 400;
// 生成指定尺寸的图象
$boardSource = imagecreatetruecolor($boardWidth, $boardHeight);
// 图像分配个白色,后面的参数是GRB
$white = imagecolorallocate($boardSource, 255, 255, 255);
// 给背景填充颜色
imagefill($boardSource, 0, 0, $white);
//普通中文文字
$text = '测试编码问题';
//测试符号问题
$pictogram = '¥';
//测试emoji表情问题
$emoji = '
如何使用PHP GD库生成海报 相关文章
.net5 core webapi进阶之四:异步编程(下篇)BeginInvoke( )/EndInvoke( )的使用
实现异步操作,除了用 async 和 await 这对组合之外,还可以通过委托对象的 BeginInvoke( ) 和 EndInvoke( ) 来完成 , 为了简化代码,我们直接使用系统为我们提供的内置委托 FuncT1,T2,...TResult 来Demo,代码如下: (注:目前.net5 core 还不支持 BeginI
php date 时间差
date 时间 时间第二个参数0 1970-01-01 时间第二个参数是负数 小于1970-01-01 日期比较 strtotime() 转为 时间戳date("Y-m-d",strtotime("-1 day"));date("Y-m-d",strtotime("-1 month"));date("Y-m-d",strtotime("-1 year")); 时间差 $zero1 = strtotime(da
Vue prop父组件传值给子组件
子组件使用 v-bind 或它的省略形式绑定响应式数据students: div id="app" student-list :students="students"/student-list /div 注册子组件时,使用 props 来接收父组件传递过来的值: Vue.component('student-list', { props: ['students'], data: functi
deepin 340 USB转console线驱动安装及使用
刚换DEEPIN系统, 有个路由器要做调整,的确是没windows友好,查了网上资料,归总一下。 zhaodong@zhaodong-PC:sudo find / -name serial 进入 zhaodong@zhaodong-PC:~/Desktop$ cd /usr/lib/modules/5.4.70-amd64-desktop/kernel/drivers/usb/serial 不一样
html中hr怎么设置粗细
在html中,可以使用css border属性来设置hr水平线的粗细、颜色等样式,只需要给hr标签添加“border: 宽度值 样式值 颜色值;”样式即可,例“hr{border: 5px solid red;}”。 本教程操作环境:windows7系统、CSS3HTML5版、Dell G3电脑。 hr是html页面上的一条
php 缓存方法是什么
php缓存方法是:1、文件缓存;2、使用Memcached高性能的分布式内存对象缓存系统;3、使用Redis;4、使用APC开放自由的PHP opcode缓存。 本教程操作环境:windows7系统、PHP5.6版,DELL G3电脑,该方法适用于所有品牌电脑。 php缓存方法是: 1、文件缓存(不多
namesapce命名空间
1.命名空间的使用目的 在 PHP 中 函数 、 类 、 常量 是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间,故而命名空间只影响 类、函数、常量 ( const )。 2.命名空间的使用格式 a.可以命名一个空间 ?phpnamespace space1;//namespace关键字+空
浅谈windows10下安装php seaslog扩展的方法
本篇文章给大家介绍一下windows10下安装php seaslog扩展的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 【推荐学习:《PHP视频教程》】 一、检查系统环境情况 使用phpinfo()检查系统环境情况,找到需要下载的配置信息。 Thread S
PHP使用字符串名称调用类的方法是什么
PHP使用字符串名称调用类的方法:1、使用【call_user_func】方法,代码为【call_user_func(array($game, Play), 1)】;2、使用Play方法,代码为【$game-{Play}(2)】。 本教程操作环境:windows7系统、PHP5.6版,DELL G3电脑,该方法适用于所有品牌电脑。 PHP
php与apache配置成功的方法是什么
php与apache配置成功的方法:首先检查php是否配置成功,在【wamp/www】根目录写一个【phpinfo.php】文件;然后打开网页输入localhost,如果能输出内容列表就显示已经配置成功。 本教程操作环境:windows7系统、PHP5.6版,DELL G3电脑,该方法适用于所有品牌