暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

thinkphp5.1 验证码 图像处理

php自学笔记 2021-08-04
965

一 验证码 

首先使用Composer
安装think-captcha
扩展包:

composer require topthink/think-captcha=2.0.*

在模版内添加验证码的显示代码

<div>{:captcha_img()}</div>
<div><img src="{:captcha_src()}" alt="captcha" /></div>

然后使用框架的内置验证功能 

$this->validate($data,[
'captcha|验证码'=>'require|captcha'
]);

如果没有使用内置验证功能,则可以调研内置的函数手动验证 

if(!captcha_check($captcha)){
// 验证失败
};

验证码的自定义用法

use think\captcha\Captcha;

class Index
{
public function verify()
{
$captcha = new Captcha();
return $captcha->entry();
}

}

通常可以给验证码地址注册路由

Route::get('verify','index/verify');

在模板中就可以使用下面的代码显示验证码图片

<div><img src="{:url('index/verify')}" alt="captcha" /></div>

如果你需要在一个页面中生成多个验证码的话,entry
方法需要传入可标识的信息(数字或者字符串),例如:

$captcha = new Captcha();
return $captcha->entry(1);

可以用Captcha
类的check
方法检测验证码的输入是否正确,

// 检测输入的验证码是否正确,$value为用户输入的验证码字符串
$captcha = new Captcha();
if( !$captcha->check($value))
{
// 验证失败
}

或者直接调用封装的一个验证码检测的函数captcha_check

// 检测输入的验证码是否正确,$value为用户输入的验证码字符串
if( !captcha_check($value ))
{
// 验证失败
}

如果你在页面上同时生成了多个验证码,则可以使用

// 检测输入的验证码是否正确,$value为用户输入的验证码字符串,$id为验证码标识
if( !captcha_check($value, $id ))
{
// 验证失败
}

验证码的配置参数

Captcha
类带有默认的配置参数,支持自定义配置。这些参数包括:

参数描述默认
codeSet验证码字符集合
expire验证码过期时间(s)1800
useZh使用中文验证码false
zhSet中文验证码字符串
useImgBg使用背景图片false
fontSize验证码字体大小(px)25
useCurve是否画混淆曲线true
useNoise是否添加杂点true
imageH验证码图片高度,设置为0为自动计算0
imageW验证码图片宽度,设置为0为自动计算0
length验证码位数5
fontttf验证码字体,不设置是随机获取
bg背景颜色[243, 251, 254]
reset验证成功后是否重置true
$config =    [
// 验证码字体大小
'fontSize' => 30,
// 验证码位数
'length' => 3,
// 关闭验证码杂点
'useNoise' => false,
];
$captcha = new Captcha($config);
return $captcha->entry();

$captcha = new Captcha();
$captcha->fontSize = 30;
$captcha->length = 3;
$captcha->useNoise = false;
return $captcha->entry();

验证码的字体是随机使用扩展包内 think-captcha/assets/ttfs
目录下面的字体文件,我们可以指定验证码的字体,例如:

$captcha = new Captcha();
$captcha->fontttf = '5.ttf';
return $captcha->entry();

$captcha = new Captcha();
// 开启验证码背景图片功能 随机使用扩展包内`think-captcha/assets/bgs`目录下面的图片
$captcha->useImgBg = true;
return $captcha->entry();

$captcha = new Captcha();
// 使用中文验证码(字体使用扩展包内`think-captcha/assets/zhttfs`字体文件)
$captcha->useZh = true;
return $captcha->entry();

$captcha = new Captcha();
// 设置验证码字符为纯数字
$captcha->codeSet = '0123456789';
return $captcha->entry();

$captcha = new Captcha();
$captcha->useZh = true;
// 设置验证码字符
$captcha->zhSet = '们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这';
return $captcha->entry();

默认的验证码字符已经剔除了易混淆的1l0o
等字符   


二 图像处理 

使用Composer
安装ThinkPHP5
的图像处理类库:

composer require topthink/think-image

使用open
方法打开图像文件进行相关操作:

$image = \think\Image::open('./image.png');

也可以从直接获取当前请求中的文件上传对象,例如:

$image = \think\Image::open(request()->file('image'));

获取图像信息

可以获取打开图片的信息,包括图像大小、类型等,例如:

$image = \think\Image::open('./image.png');
// 返回图片的宽度
$width = $image->width();
// 返回图片的高度
$height = $image->height();
// 返回图片的类型
$type = $image->type();
// 返回图片的mime类型
$mime = $image->mime();
// 返回图片的尺寸数组 0 图片宽度 1 图片高度
$size = $image->size();

裁剪图片

使用crop
save
方法完成裁剪图片功能。

$image = \think\Image::open('./image.png');
//将图片裁剪为300x300并保存为crop.png
$image->crop(300, 300)->save('./crop.png');

支持从某个坐标开始裁剪,例如下面从(100,30)开始裁剪,例如:

$image = \think\Image::open('./image.png');
//将图片裁剪为300x300并保存为crop.png
$image->crop(300, 300,100,30)->save('./crop.png');

生成缩略图

使用thumb
方法生成缩略图,例如:

$image = \think\Image::open('./image.png');
// 按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.png
$image->thumb(150, 150)->save('./thumb.png');

还可以支持其他类型的缩略图生成,设置包括\think\Image
的下列常量或者对应的数字:

//常量,标识缩略图等比例缩放类型
const THUMB_SCALING = 1;
//常量,标识缩略图缩放后填充类型
const THUMB_FILLED = 2;
//常量,标识缩略图居中裁剪类型
const THUMB_CENTER = 3;
//常量,标识缩略图左上角裁剪类型
const THUMB_NORTHWEST = 4;
//常量,标识缩略图右下角裁剪类型
const THUMB_SOUTHEAST = 5;
//常量,标识缩略图固定尺寸缩放类型
const THUMB_FIXED = 6;

比如我们居中裁剪:

$image = \think\Image::open('./image.png');
// 按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.png
$image->thumb(150,150,\think\Image::THUMB_CENTER)->save('./thumb.

图像翻转

使用flip
可以对图像进行翻转操作,默认是以x轴进行翻转,例如:

$image = \think\Image::open('./image.png');
// 对图像进行以x轴进行翻转操作
$image->flip()->save('./filp_image.png');

以y轴进行翻转,例如:

$image = \think\Image::open('./image.png');
// 对图像进行以y轴进行翻转操作
$image->flip(\think\image::FLIP_Y)->save('./filp_image.png');

图像旋转

使用rotate
可以对图像进行旋转操作(默认是顺时针旋转90度),我们用默认90度进行旋转举例:

$image = \think\Image::open('./image.png');
// 对图像使用默认的顺时针旋转90度操作
$image->rotate()->save('./rotate_image.png');

图像保存参数

save
方法可以配置的参数

参数默认描述
pathname必填项图像保存路径名称
type默认与原图相同图像类型
quality80图像质量
interlacetrue是否对JPEG类型图像设置隔行扫描

设置隔行扫描的情况下在网页进行浏览时。是从上到下一行一行的显示,否则图片整个显示出来 然后由模糊到清晰显示。

添加水印

$image = \think\Image::open('./image.png');
// 给原图左上角添加水印并保存water_image.png
$image->water('./logo.png')->save('water_image.png');

water
方法的第二个参数表示水印的位置,默认值是WATER_SOUTH
,可以传入下列\think\Image
类的常量或者对应的数字:

//常量,标识左上角水印
const WATER_NORTHWEST = 1;
//常量,标识上居中水印
const WATER_NORTH = 2;
//常量,标识右上角水印
const WATER_NORTHEAST = 3;
//常量,标识左居中水印
const WATER_WEST = 4;
//常量,标识居中水印
const WATER_CENTER = 5;
//常量,标识右居中水印
const WATER_EAST = 6;
//常量,标识左下角水印
const WATER_SOUTHWEST = 7;
//常量,标识下居中水印
const WATER_SOUTH = 8;
//常量,标识右下角水印
const WATER_SOUTHEAST = 9;

复制

还可以支持水印图片的透明度(0~100,默认值是100),例如:

$image = \think\Image::open('./image.png');
// 给原图左上角添加透明度为50的水印并保存alpha_image.png
$image->water('./logo.png',\think\Image::WATER_NORTHWEST,50)->save('alpha_image.png');

也可以支持给图片添加文字水印(我们复制一个字体文件HYQingKongTiJ.ttf
到入口目录),我们现在生成一个像素20px,颜色为#ffffff
的水印效果:

$image = \think\Image::open('./image.png');
// 给原图左上角添加水印并保存water_image.png
$image->text('十年磨一剑 - 为API开发设计的高性能框架','HYQingKongTiJ.ttf',20,'#ffffff')->save('text_image.png');

文字水印参数

参数默认描述
text不能为空添加的文字
font不能为空字体文件路径
size不能为空字号,单位是像素
color#00000000文字颜色
locateWATER_SOUTHEAST文字写入位置
offset0文字相对当前位置的偏移量
angle0文字倾斜角度


文章转载自php自学笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论