php上传图片制作海报功能,如何使用PHP GD库生成海报

如何使用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电脑,该方法适用于所有品牌

你可能感兴趣的:(php上传图片制作海报功能)