1、图像应用场景
上传头像 验证码 图片水印 图片缩放
2、基本概念
MIME:多用途互联网邮件扩展类型,主要用来在邮件传输和http协议中指定文件类型
图片类型
比如常见的MIME类型
html文件: text/html
.png image/png
.jpeg/jpg/jpe image/jpeg
.gif image/gif
如何查看mime类型: wamp64->bin->apache->conf->mime.types;
3、gd库
如果要使用图像处理函数,需要打开gd库。
4、封装一个验证码函数
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/1/12 0012
* Time: 下午 5:35
*/
//封装验证码的函数
/*参数1:画布的宽度
*参数2:画布的高度
* 参数3:验证码的个数是多少个
* 参数4:验证码的显示类型:纯数字:0 | 纯字母(大小写):1 | 数字字母混合:2
*
* */
function verify($width = 120,$height = 60,$num = 4,$type = 2)
{
/**/
//1、创建画布 imagecreatetruecolor 参数1:宽度 参数2:高度
$image = imagecreatetruecolor($width,$height);
//2、给画布填充颜色 imagefill 区域填充 (参数1:img资源 参数2:x轴坐标,参数3:y轴坐标 参数4:颜色)
//为区分画布的颜色和验证码的颜色,需要封装两个函数来区分(浅色、深色)
imagefill($image,0,0,lengcolor($image));
//3、生成验证码,通过switch case 循环语句(注:在传进来的参数中验证码的类型做分类,这里给出的是混合)
switch ($type){
//调用封装好的函数
case 0:
$code = randNum();
break;
case 1:
$code = randChar();
break;
case 2;
$code = mix();
break;
}
//4、将验证码写到画布上面去
/*考虑验证码在画布上的
*
* */
$cellWidth = floor($width/$num);
for($i = 0; $i < $num;$i++) {
$x = mt_rand($i * $cellWidth,($i + 1)*$cellWidth - 15);
$y = mt_rand(0,$height - 15);
imagechar($image,5,$x,$y,$code[$i],DarkColor($image));
}
//5、画干扰点干扰线
for ($i =0; $i <= 100; $i++) {
imagesetpixel($image,mt_rand(0,$width),mt_rand(0,$height),DarkColor($image));
}
//画干扰线
for($i = 0; $i < 5; $i++) {
imagearc($image,mt_rand(0,$width),mt_rand(0,$height),mt_rand(0,$width),mt_rand(0,$height),mt_rand(0,360),mt_rand(0,360),lengcolor($image));
}
//6、告诉浏览器mime类型
header('content-type:image/png');
//在浏览器中输出
imagepng($image);
//销毁资源
imagedestroy($image);
return $code;
}
echo verify();
/*封装深色函数
*参数:img资源
*/
function Darkcolor($image)
{
//通过imagecolorallocate函数来创建颜色,然后通过mt_rand函数随机深色
//颜色是越小越深
return imagecolorallocate($image,mt_rand(0,127),mt_rand(0,127),mt_rand(0,127));
}
/*封装浅色函数
*参数:img资源
*/
function lengcolor($image)
{
//通过imagecolorallocate函数来创建颜色,然后通过mt_rand函数随机浅色
//颜色是越大越浅
return imagecolorallocate($image,mt_rand(127,255),mt_rand(127,255),mt_rand(127,255));
}
/*封装获取验证码的函数
* 1、封装获取全数字的情况
* 2、封装获取字母的情况
* 3、获取获取有数字和字母的混合情况
* */
/*封装获取全数字的情况
*参数:输出的验证码个数
*/
function randNum($num = 4)//输出4个
{
//数字是从0-9中随机出现的
/*$str = '0123456789';
//通过函数substr函数返回,str_shuffle()函数打乱字符串中的顺序
//substr(参数1:字符串, 参数2:开始的位置(也就是第一个),参数3:可选(返回的长度取决于字符串的长度))
return substr(str_shuffle($str),0,$num);*/
//方法2:通过range函数将0-9建立成一个数组
/* $arr = range(0,9);
//implode是将数组转换为字符串的形式,join也可以
$str = implode('',$arr);
return substr(str_shuffle($str),0,$num);*/
//方法3:
$arr = range(0,9);
//shuffle函数是打乱数组的顺序
shuffle($arr);
//array_slice:从数组中提取一段 参数1:提取的数组,参数2:偏移量 参数3:长度
return join('',array_slice($arr,0,$num));
}
//echo randNum();
/*封装全字母的情况
* 参数:验证码的个数
* */
function randChar($num = 4)
{
//方法1:通过字符串函数
/*$str = 'zxcvbnmasdfghjklqwertyuiopZXCVBNMASDFGHJKLQWERTYUIOP';
return substr(str_shuffle($str),0,$num);*/
//方法2:通过range函数,创建一个数组
/*$arr = range('a','z');
$arr1 = range('A','Z');
//通过函数array_merge 将数组合并
$new = array_merge($arr,$arr1);
//shuffle函数打乱顺序
shuffle($new);
//array_slice:从数组中提取一段 参数1:提取的数组,参数2:偏移量 参数3:长度
return join('',array_slice($new,0,$num));*/
//方法3:通过range函数将小写字母写成数组,strtoupper 函数将数组中的小写再转换为大写
$arr = range('a','z');
//把数组转换成字符串,再用strtoupper函数(一个参数)转化为大写
$str = implode('',$arr);
$str1 = strtoupper($str);
return substr(str_shuffle($str1),0,$num);
}
//echo randChar();
/*封装数字字母混合的函数
* 参数:验证码的个数
* */
function mix($num = 4)
{
//方法1:通过range建立数组的形式
$arr1 = range(0,9);
$arr2 = range('a','z');
$arr3 = range('A','Z');
//通过函数array_merge合并成一个数组
$array = array_merge($arr1,$arr2,$arr3);
//通过join和implode函数转换为字符串
$str = join('',$array);
//通过函数substr函数返回,str_shuffle()函数打乱字符串中的顺序
//substr(参数1:字符串, 参数2:开始的位置(也就是第一个),参数3:可选(返回的长度取决于字符串
return substr(str_shuffle($str),0,$num);
//方法2:直接调用封装好的两个函数 randNum() randChar()
$str1 = randNum();
$str2 = randChar();
return substr(str_shuffle($str1,$str2),0,$num);
}
echo mix();