如何在PHP中开启GD库支持
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在PHP中开启GD库支持相关的知识,希望对你有一定的参考价值。
Linux下开启php的GD库支持#开启GD库支持有以下几种方法
##检测GD库是否安装命令
php5 -m | grep -i gd
或者
php -i | grep -i --color gd
##如未安装GD库,则为服务器安装,方法如下
### 如果是源码安装,则加入参数
--with-gd
### 如果是debian系的linux系统,用apt-get安装,如下
apt-get install php5-gd
### 如果是CentOS系的系统,用yum安装,如下
yum install php-gd
### 如果是suse系的linux系统,用yast安装,如下
yast -i php5_gd
### 如果嫌这个世界不够蛋疼呢,可以在原先编译PHP不支持GD的情况下附加
先下zlib源码,libpng源码,gd源码
解压后到源码目录
zlib目录
./configure --prefix=/usr/local/zlib
make ; make install
make clean
libpng目录
cp scripts/makefile.linux ./makefile
./configure --prefix=/usr/local/libpng
make ; make install
make clean
gd目录
./configure --prefix=/usr/local/libgd --with-png=/usr/local/libpng
make ; make install
make clean
最后在php.ini中,搜到[gd]后,在下面加一行
extension=/usr/local/libgdgd.so
然后重启php服务,如果不行,试试reboot
好了,不过最后提醒一下,要知道这个世界很多意外的,源码安装,只添加gd库这一个情况下,PHP版本和库的版本各异,所以:
- 不保证这么付出了这么多后有回报
- 不保证能够成功加载gd.so
- 不保证不怀孕
所以如果是源码安装,最好还是在编译PHP的时候加参数--with-gd
Windows下开启PHP的GD库支持
找到php.ini,打开内容,找到:
;extension=php_gd2.dll
把最前面的分号“;”去掉,再保存即可,如果本来就没有分号,那就是已经开启了。
##安装完毕后
**请查看,AKCMS后台/index.php?file=welcome&action=phpmodules或者PHP探针,GD库是否安装成功** 参考技术A 修改php的配置文件,取消GD库的注释,然后重启web服务就可以了~ 参考技术B 记得PHP默认没有开启GD库的支持,需要自行开启。于是就打开PHP安装目录/php.ini配置文件,找到如下内容:
;extension=php_gd2.dll
按照网上搜索得来的方法,去掉前面表示注释的符号";",然后重新启动Apache,结果发现还是不行,通过phpinfo()函数仍然无法看到任何与GD库相关的信息。看到网上很多关于「PHP开启GD库」的文章,都是直接说一句「去掉xxx前面的分号」,就没有下文了。事实证明,仅仅这么做明显是不行的,至少官方zip版本的php这么配置是不行的。
于是就只好自己检查php.ini的配置内容,最后发现其中有如下一行:
;extension_dir = "ext" //这里是windows的
linux的好像是 ;extension_dir = "./"
很明显,extension_dir指令被注释掉了,导致php连扩展库的ext都找不到,自然不可能找到扩展库中的php_gd2.dll了,gd库支持自然也没有开启。
于是,照猫画虎地去掉extension_dir指令前面的注释符号";",再次重启服务器,结果……还是不行。这不科学啊,难道extension_dir指令的值"ext"有问题?
PHP官方说,PHP5搜索扩展库的默认位置为C:\php5,于是尝试着按照官方的说法,仍然让extension_dir保持被注释掉的现状,在C盘下新建了一个php5文件夹,然后将php_gd2.dll复制进去,再次重新启动服务器,结果……还是不行。
此时,通过phpinfo()函数查看得知,在php.ini中没有开启extension_dir指令时,phpinfo()上的extension_dir显示的值居然是C:\php——难道官方的说明文档也出错了,或者说PHP 5.4这个版本已经作了变更、而官方文档还没有及时更新?其他的先不管那么多了,先试试C:\php行不行,于是将php5重命名为php,其他一切照旧,接着重新启动,然后通过phpinfo()函数查看到gd库已经开启了。——这至少证明,在PHP 5.4.19中,扩展库的默认搜索位置为C:\php。
当然,众所周知,extension_dir指令是支持绝对路径的,上面折腾半天,主要是为了搞明白extension_dir指令的作用与影响。最后还是将extension_dir前面的注释符号";"去掉,然后将其值改为ext的绝对路径,详细代码如下:
extension_dir = "F:/.4.19/ext" //windows写法。。。因情而定
综上所述,对于php官方版而言,要开启gd库支持,不仅要去掉extension=_gd2.dll前的注释符号,还要去掉extension_dir指令前的注释符号,并将其值作对应修改。当然,不仅仅是gd库,如果需要开启其他PHP扩展库,例如php_mysql、php_mysqli,方法也是类似的。”
PHP之GD库扩展
一、开始GD扩展
GD库是用来处理图片的。使用GD库,首先在php.ini中开启GD扩展
extension=php_gd2.dll
开启以后就可以使用image开头的函数了
二、创建最简单的图片
步骤
- 创建画布
- 给画布填充颜色(给画布分配的第一个颜色自动填充成背景色)
- 显示图片
<?php
$img=imagecreate(200,100); //创建图片
//var_dump($img); //resource(2) of type (gd)
imagecolorallocate($img,255,0,0); //给图片分配第一个颜色,默认是背景色
//操作一:显示图片
/*
//告知浏览器用jpg格式显示
header('content-type:image/jpeg');
//显示图片
imagejpeg($img); //用jpg格式显示图片
*/
//操作二:保存图片(不需要设置header头)
imagejpeg($img,'./tu.jpg');
多学一招
imagepng():将图片输出为png格式
imagegif():将图片输出为gif格式
小结:
- 第一个分配的颜色是背景色
- 要在浏览器显示画布,需要设置header()头
- 保存画布,不需要设置header()头
三、填充颜色
给图片分配的第一个颜色自动填充成背景色,如果要更换背景色需要手动的填充颜色
<?php
$img=imagecreate(200,100); //创建图片资源
$color=imagecolorallocate($img,200,200,200);
//更改背景色
switch(rand(1,100)%3)
case 0:
$color=imagecolorallocate($img,255,0,0); //颜色的索引编号
break;
case 1:
$color=imagecolorallocate($img,0,255,0);
break;
default:
$color=imagecolorallocate($img,0,0,255);
//填充颜色
imagefill($img,0,0,$color);
//显示图片
header('content-type:image/png');
imagepng($img);
四、验证码
4.1、验证码的作用
防止暴力破解
4.2、原理
创建一个图片,在图片上写上一串随机字符串
实现步骤:
- 第一步:生成随机字符串
- 第二步:创建画布
- 将字符串写到画布上
imagestring(图片资源,内置字体,起始点x,起始点y,字符串,颜色编号)
难点:字符串居中
4.3、代码实现
<?php
//第一步:创建随机字符串
//1.1 创建字符数组
$all_array=array_merge(range('a','z'),range('A','Z'),range(0,9)); //所有字符数组
$div_array=['1','l','0','o','O','I']; //去除容易混淆的字符
$array=array_diff($all_array,$div_array); //剩余的字符数组
unset($all_array,$div_array); //销毁不需要使用的数组
//1.2 随机获取4个字符
$index=array_rand($array,4); //随机取4个字符,返回字符下标,按先后顺序排列
shuffle($index); //打乱字符
//1.3 通过下标拼接字符串
$code='';
foreach($index as $i)
$code.=$array[$i];
//第二步:创建画布
$img=imagecreate(150,30);
imagecolorallocate($img,255,0,0); //分配背景色
$color=imagecolorallocate($img,255,255,255); //分配前景色
//第三步:将字符串写到画布上
$font=5; //内置5号字体
$x=(imagesx($img)-imagefontwidth($font)*strlen($code))/2;
$y=(imagesy($img)-imagefontheight($font))/2;
imagestring($img,$font,$x,$y,$code,$color);
//显示验证码
header('content-type:image/gif');
imagegif($img);
小结:
- range():生成指定范围的数组
- array_merge():合并数组
- array_diff():计算数组的差集
- array_rand():随机获取数组元素
- shuffle():打乱数组
- 去除容易混淆的字符
- 数组要打乱
- 起始点x=(图片宽度-字符串宽度)/2
- 字符串宽度=字符的宽度*字符的个数
- 起始点y=(图片高度-字符高度)/2
运行结果
五、打开图片创建验证码
步骤:
- 生成随机字符串
- 打开图片
- 将字符串写到图片上
代码实现
<?php
//第一步:生成随机字符串
$codeSet='2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY';
$code='';
$max=strlen($codeSet);//strlen() 函数返回字符串的长度
for($i=1;$i<=4;$i++)
$index=rand(0,$max-1);
$code.=$codeSet[$index];
//第二步:打开图片
$path='./captcha/captcha_bg'.rand(1,5).'.jpg';
$img=imagecreatefromjpeg($path);
//第三步:将字符串写到图片上
$font=5; //内置5号字体
$x=(imagesx($img)-imagefontwidth($font)*strlen($code))/2;
//imagesx() 函数用于获取图像的宽度,单位为像素,返回值为整型。
//imagesy() 函数用于获取图像的高度,语法及用法同 imagesx() 。
//imagefontwidth — 取得字体宽度
//imagefontheight — 取得字体高度
$y=(imagesy($img)-imagefontheight($font))/2;
//随机前景色
$color=imagecolorallocate($img,255,255,255); //设置背景色
//imagecolorallocate — 为一幅图像分配颜色
//int imagecolorallocate( resource $image, int $red, int $green, int $blue)
if(rand(1,100)%2)
$color=imagecolorallocate($img,255,0,0); //设置背景色
imagestring($img,$font,$x,$y,$code,$color);
//imagestring — 水平地画一行字符串
//bool imagestring( resource $image, int $font, int $x, int $y, string $s, int $col)
//显示验证码
header('content-type:image/gif');
imagegif($img);
//imagegif — 输出图象到浏览器或文件。
运行结果:
多学一招:captcha
六、中文验证码
6.1、步骤与思考
思考:
- 中文验证码需要引入字体文件,内置字体不支持中文
- 使用
imagettftext(图片资源,字号大小,角度,起始x坐标,起始y坐标,颜色,字体文件地址,字符串)
写入中文 - 字体保存在
C:\\Windows\\Fonts
目录下 - 用
imagettfbbox()
测定中文字符串的宽高,此函数返回8个值,4个角的坐标
步骤:
- 生成随机字符串
- 创建画布
- 将字符串写到画布上
6.2、代码实现
将黑体拷贝到站点的ttf目录下
七、水印
7.1、文字水印
- 在图片上添加文字或图片,目的:宣传,防止盗图
- 水印有文字水印和图片水印
- 文字水印实现原理和中文验证码是一样的
步骤:
- 打开图片
- 将文字写到图片上
- 输出图片(另存图片)
实现
<?php
//第一步:打开图片
$img=imagecreatefromjpeg('./face.jpg');
//第二步:将文字写到图片上
$color=imagecolorallocate($img,255,0,0);
$size=35; //字号
$angle=0; //角度
$fontfile='./ttf/simhei.ttf'; //字体路径
$code='传智播客黑马程序员';
$info=imagettfbbox($size,$angle,$fontfile,$code);
$code_w=$info[4]-$info[6]; //字符串的宽度
$code_h=$info[1]-$info[7]; //字符串的高度
$x=imagesx($img)-$code_w; //起始点的$x
$y=imagesy($img)-$code_h; //起始点的$y
//将中文字符串写到画布上
imagettftext($img,$size,$angle,$x,$y,$color,$fontfile,$code); //将文字写到画布上
//第三步:保存图片
imagejpeg($img,'./face.jpg');
实现效果
7.2、图片水印
原理:将水印图片拷贝复制到目标图片上。
步骤:
1、打开源图
2、打开目标图
3、复制源图拷贝到目标图上
实现
<?php
//第一步:打开源图
$src_img=imagecreatefromjpeg('./water.jpg');
//第二步:打开目标图
$dst_img=imagecreatefromjpeg('./face.jpg');
//第三步:将源图复制到目标图上
$dst_x=imagesx($dst_img)-imagesx($src_img); //开始粘贴的x
$dst_y=imagesy($dst_img)-imagesy($src_img); //开始粘贴的y
$src_w=imagesx($src_img);
$src_h=imagesy($src_img);
imagecopy($dst_img,$src_img,$dst_x,$dst_y,0,0,$src_w,$src_h);
//显示水印图
header('content-type:image/jpeg');
imagejpeg($dst_img);
运行结果
八、缩略图
上传图片后,将图片变成统一的大小的缩略图
原理:将源图复制拷贝到目标图上,并缩放大小。
步骤
1、创建目标图
2、打开源图
3、复制源图,拷贝到目标图上
代码实现
<?php
//第一步:创建目标图
$dst_img=imagecreatetruecolor(200,200);
//第二步:打开源图
$src_img=imagecreatefromjpeg('./face.jpg');
//第三步:复制源图拷贝到目标图上,并缩放大小
$src_w=imagesx($src_img);
$src_h=imagesy($src_img);
imagecopyresampled($dst_img,$src_img,0,0,0,0,200,200,$src_w,$src_h);
//第四步:保存缩略图
//header('content-type:image/jpeg');
imagejpeg($dst_img,'./face1.jpg');
注意:imagecreate()
和imagecreatetruecolor()
的区别
imagecreate():创建支持256种颜色的画布
imagecreatetruecolor():创建真彩色画布,支持256*256*256种颜色
九、验证码改错
验证码错误不会报具体的错误信息
第一招:注释header
注释掉header后,错误信息就出来了
第二招:如果没有报错,就留心一下图片代码前有无字符串输出,图片前面是不允许有任何字符串输出的
第三招:查看源码,图片代码前是否有空白字符
第四招:如果上面的三招无效,在header()前添加ob_clean();
十、使用的函数
imagecreate():创建画布
imagecreatetruecolor():创建支持真彩色的画布
imagecolorallocate():给画布分配颜色
imagejpeg():将图片以jpeg格式输出
imagegif():将图片以gif格式输出
imagepng():将图片以png格式输出
imagefill():填充颜色
imagesx():获取图片宽度
imagesy():获取图片高度
imagefontwidth():获取内置字体宽度
imagefontheight():获取内置字体高度
imagestring():将字符串写到图片上
imagecreatefromjpeg():打开jpg创建图片资源
imagecreatefrompng():打开png创建图片资源
imagecreatefromgif():打开gif创建图片资源
imagettfbbox():测定中文字体的范围
imagettftext():将中文字体写到图片上
imagecopy():图片拷贝
imagedestroy():销毁图片资源
imagecopyresampled():拷贝图片并缩放大小
以上是关于如何在PHP中开启GD库支持的主要内容,如果未能解决你的问题,请参考以下文章