GD图像处理
GD库简介
GD库是专门做图像处理的。比如验证码,缩略图,图片水印等效果
PHP操作GD库的原理
第一步:创建图片资源
第二步:对图片进行操作
第三步:输出图片资源
第四步:销毁图片资源
引入GD库
默认情况下,PHP不支持对图片的处理,必须引入GD扩展才能实现对图片的操作
开启GD库后,以image开头的函数都可以使用了。
创建图片
知识点
- imagecreate():创建图片资源
- imagecolorallocate():给图片资源分配一个颜色
- imagejpeg():图片按jpeg格式显示或保存
- imagegif():图片按gif格式显示或保存
- imagepng():图片按png格式显示或保存
- imagedestroy():销毁图片
代码
脚下留心:如果图片保存就不需要写header().
imagecolorallocate()
给图片分配颜色,默认第一个分配的颜色是背景色,返回的是颜色的编号
返回的是颜色的索引编号
画图
直线
例题
矩形
代码
圆弧
例题1
例题2
例题3
曲线
曲线是由多个像素点组成,画曲线就是画许多像素点
例题
验证码
验证码可以防止暴力破解,通过排列组合的方式破解用户名和密码。
验证码由背景图和随机数组成
知识点
- imagestring()
- 字符串居中
-
- Imagesx():获取图片宽度
- Imagesy():获取图片高度
- Imagefontwidth():获取图片内置字体的宽度
- Imagefontheight():获取图片内置字体的高度
代码
<?php
//第一步:生成随机字符串
$char_array=array_merge(range(‘a’,’z’),range(‘A’,’Z’),range(0,9)); //字母和数字的数组
$indexes=array_rand($char_array,4); //随机抽取4个字符,返回字符下标数组
shuffle($indexes); //打乱数组
$str=”;
foreach($indexes as $i) {
$str.=$char_array[$i];
}
//第二步:将字符串写到背景图
$img=imagecreate(200,100);
imagecolorallocate($img,255,0,0); //背景色
$color=imagecolorallocate($img,255,255,255); //前景色
$img_w=imagesx($img); //图片宽度
$img_h=imagesy($img); //图片高度
$font=5; //内置的5号字体
$font_w=imagefontwidth($font); //字符宽度
$font_h=imagefontheight($font); //字符高度
$x=($img_w-$font_w*strlen($str))/2; //起始点x坐标
$y=($img_h-$font_h)/2; //起始点y坐标
imagestring($img,$font,$x,$y,$str,$color); //将字符串写到图片上
//输出图片
header(‘Content-Type:image/png’);
imagepng($img);
运行结果
中文验证码
Imagestring()不能做中文的验证码,要使用中文做验证码需要使用imagettftext()。
将字体拷贝到站点下
知识点
获取字体的范围
返回值
代码
基线
代码
<?php
$img=imagecreate(200,100);
imagecolorallocate($img,255,0,0); //背景色
$color=imagecolorallocate($img,255,255,255); //前景色
//生成随机中文字符串
$char_array=[‘锄’,’禾’,’日’,’当’,’午’,’汗’,’滴’,’禾’,’下’,’土’,’我’,’爱’,’北’,’京’,’天’,’安’,’门’];
$indexes=array_rand($char_array,4); //随机抽取4个字符,返回字符下标数组
shuffle($indexes); //打乱数组
$str=”;
foreach($indexes as $i) {
$str.=$char_array[$i];
}
//字体参数
$size=20; //字号
$angle=0; //角度
$fontfile=’./fonts/simhei.ttf’; //字体
//获取字体范围
$info=imagettfbbox($size,$angle,$fontfile,$str); //返回字符串的4个角的坐标4
$x=(imagesx($img)-($info[4]-$info[6]))/2; //起始X轴
$y=imagesy($img)/2+($info[1]-$info[7])/3; //起始y轴(字体基线的位置,不是字符的最底端。)
//将中文写到图片上
imagettftext($img,$size,$angle,$x,$y,$color,$fontfile,$str);
//输出图片
header(‘Content-Type:image/png’);
imagepng($img);
运行结果
打开已有图片实现验证码
打开已经存在的图片创建画布
- imagecreatefromgif():打开gif图创建画布
- imagecreatefromjpeg():打开jpeg图创建画布
- imagecreatefrompng():打开png图创建画布
代码
<?php
//第一步:生成随机字符串
$char_array=array_merge(range(‘a’,’z’),range(‘A’,’Z’),range(0,9)); //字母和数字的数组
$indexes=array_rand($char_array,4); //随机抽取4个字符,返回字符下标数组
shuffle($indexes); //打乱数组
$str=”;
foreach($indexes as $i) {
$str.=$char_array[$i];
}
//第二步:将字符串写到图片上
$path=’./captcha/captcha_bg’.rand(1,5).’.jpg’; //图片路径
$img=imagecreatefromjpeg($path); //打开已经存在的jpeg图
$color=imagecolorallocate($img,255,0,0); //分配红色
if(rand(1,2)==1) {
$color=imagecolorallocate($img,0,255,100); //分配白色
}
$img_w=imagesx($img); //图片宽度
$img_h=imagesy($img); //图片高度
$font=5; //内置的5号字体
$font_w=imagefontwidth($font); //字符宽度
$font_h=imagefontheight($font); //字符高度
$x=($img_w-$font_w*strlen($str))/2; //起始点x坐标
$y=($img_h-$font_h)/2; //起始点y坐标
imagestring($img,$font,$x,$y,$str,$color); //将字符串写到图片上
//输出图片
header(‘Content-Type:image/png’);
imagepng($img);
运行结果
添加水印
添加水印的目的为了防止被盗图。
添加文字水印
<?php
$img=imagecreatefromjpeg(‘./face.jpg’); //打开原图
$color=imagecolorallocate($img,255,0,0); //分配颜色
//字体参数
$size=40; //字号
$angle=0; //角度
$fontfile=’./fonts/simhei.ttf’; //字体
//获取字体范围
$str=’传智播客版权’;
$info=imagettfbbox($size,$angle,$fontfile,$str); //返回字符串的4个角的坐标4
$x=imagesx($img)-($info[4]-$info[6]); //起始X轴
$y=imagesy($img)-($info[1]-$info[7])/3; //起始y轴(字体基线的位置,不是字符的最底端。)
//将中文写到图片上
imagettftext($img,$size,$angle,$x,$y,$color,$fontfile,$str);
//输出图片
header(‘Content-Type:image/png’);
imagepng($img);
😎
添加图片水印
代码
生成缩略图
将大图自动的生成小缩略图
原图的参数:起始x,起始y,拷贝宽度,拷贝高度
目标图的参数:目标图x,目标图y,目标宽度,目标高度
使用函数
脚下留心:imagecreatetruecolor()和imagecreate()区别
imagecreatetruecolor()新建一个真彩色图像(RGB模式),默认背景色黑色
imagecreate():新建一个基于调色板的图像,只支持256种颜色,默认背景白色
给图片填充颜色
深入理解imagefill()
例题
关于图片处理的改错
第一:如果报错,就按报错的信息更改
第二:不报错,但是图片显示不出来
注释header(),查看错误
第三:注释header()如果没有报错,就查看源码
第三:终极一招,ob_clean()
如果上面的方法都没有效果,可以尝试ob_clean()
原理:图片输出之前不能有任何字符的输出,ob_clean()情况缓存中所有输出。
思考题
制作等比缩略图