PHP之GD库案例实战
- 目录
- 1. 前言
- 2.GD库之缩略图的实现
- 2.1验证扩展安装成功(五种方式)
- 2.2 简述GD库操作流程
- 3.验证码的实现
- 3.1验证码的实现
- 3.1.1生成基本的验证码
- 3.1.2给验证码添加干扰元素
- 3.2验证码的封装与测试
- 4.GD库之图片水印的实现
- 4.1缩略图的实现
- 4.2 缩略图效果及等比例缩放的实现
- 4.2.1写死比例缩放
- 4.2.2等比例缩放
- 4.2.3优化缩略图操作
- 4.3 文字水印效果的实现
- 4.4 图片水印效果的实现
- 4.5缩略图和水印封装及测试
1.前言
PHP可以创建和处理包括gif,png,jpeg,wbmp以及xpm在内的多种格式图像。并且可以直接将图像以数据流的形式输出到浏览器。PHP使用图像处理功能,必须配置php.ini文件开启GD函数库extension=php_gd2.dll;然后设置extension_dir=”ext目录所在的位置”;为了保证格式的在正确性,我们统一使用utf8编码header(‘content-tyoe:text/html;charset=utf-8’)。
代码分享:https://github.com/mtdgclub/GDLibrary
2.GD库之缩略图的实现
2.1验证扩展安装成功(五种方式)
- echo phpinfo();//通过phpinfo查询
- var_dump(extension_loaded(‘gd’));//检测扩展是否开启
- var_dump(function_exists(‘gd_info’));//检查函数是否可用
- var_dump(gd_info());//得到gd库信息
- print_r(get_defind_functions());//得到gd库所有已定义的函数
2.2 简述GD库操作流程
一般使用php绘画不脱离如下五个步骤:
创建画布->创建颜色->开始绘画->输出或保存图像->销毁资源
3.验证码的实现
说到图像处理,那么必然需要知道验证码的实现原理。
3.1验证码的实现
3.1.1生成基本的验证码
//详见文件achieveCode.php,$image 创建的图像资源,$size 字体大小,$angle 角度,$x 左上角,$y 字体基线的位置,$randColor 颜色索引,$fontFile 想要使用的 TrueType 字体的路径,$text UTF-8 编码的文本字符串
imagettftext($image,$size,$angle,$x,$y,$randColor,$fontFile,$text);
3.1.2给验证码添加干扰元素
//添加像素当干扰元素,详见文件achieveCode2.php
for($i=1;$i<=50;$i++){
imagesetpixel($image,mt_rand(0,$width),mt_rand(0,$height),getRandColor($image));
}
//添加线段干扰元素
for($i=1;$i<=3;$i++){
imageline($image,mt_rand(0,$width),mt_rand(0,$height),mt_rand(0,$width),mt_rand(0,$height),getRandColor($image));
}
//绘制圆弧
for($i=1;$i<=2;$i++){
imagearc($image,mt_rand(0,$width),mt_rand(0,$height),mt_rand(0,$width/2),mt_rand(0,$height/2),mt_rand(0,360),mt_rand(0,360),getRandColor($image));
}
//根据字体大小自动调节
$textWidth=imagefontwidth(28);
$textHeight=imagefontheight(28);
//开始绘制
for($i=0;$i<$length;$i++){
$size=mt_rand(20,28);
$angle=mt_rand(-15,15);
$x=($width/$length)*$i+$textWidth;
$y=mt_rand($height/2,$height-$textHeight);
$fontFile="fonts/CouriseNew.ttf";
$text=str_shuffle($string){0};
imagettftext($image,$size,$angle,$x,$y,$randColor,$fontFile,$fontFile,$text);
}
关于GD库,请务必查阅手册,熟记以下常用函数~
- imagesetpixel();
- imageline();
- imagearc();
- imagefontwidth();
- imagefontheight();
3.2验证码的封装与测试
- 初级封装_代码逻辑,详见functionImg.php
- 中级封装_封装成函数,详见getVerify.php
- 高级封装_实现验证码类,详见Captcha.class.php
- 测试验证码类,详见testCaptcha.php
4.GD库之图片水印的实现
4.1缩略图的实现
通过函数getimagesize获得图像信息,如果是图像就返回图形信息,否则返回false
$filename="image/ipad.png";
$fileInfo=getimagesize($filename);
var_dump($fileInfo);
4.2 缩略图效果及等比例缩放的实现
4.2.1写死比例缩放
//创建目标画布资源,详见thumbNail.php
$dst_image_50=imagecreatetruecolor(50,50);
$dst_image_270=imagecreatetruecolor(270,270);
//通过图片文件创建画布资源
$src_image=imagecreatefrompng($filename);
imagecopyresampled($dst_image_50,$src_image,0,0,0,0,50,50,$src_w,$src_h);
imagecopyresampled($dst_image_270,$src_image,0,0,0,0,270,270,$src_w,$src_h);
imagejpeg($dst_image_50,"images/thumb_50x50.jpg");
imagejpeg($dst_image_270,"images/thumb_270x270.jpg");
imagedestroy($dst_image_50);
imagedestroy($dst_image_270);
imagedestroy($src_image);
4.2.2等比例缩放
//设置最大的宽和高,详见equalScale.php
$dst_w=300;
$dst_h=600;
$ratio_orig=$src_w/$src_h;
if($dst_w/$dst_h>$ratio_orig){
$dst_w=$dst_h*$ratio_orig;
}else{
$dst_h=$dst_w/$ratio_orig;
}
//创建原画布资源和目标画布资源
$src_iamge=imagecreatefromjpeg($filename);
$dst_iamge=imagecreatetruecolor($dst_w,$dst_h);
imagecopyresampled($dst_iamge,$src_iamge,0,0,0,0,$dst_w,$dst_h,$src_w,$src_h);
imagejpeg($dst_iamge,"iamges/test_thumb.jpg");
imagedestroy($src_iamge);
imagedestroy($dst_iamge);
4.2.3优化缩略图操作
//动态获得文件类型,详见equalScale2.php
$mime=image_type_to_mime_type($fileInfo[2]);
$createFun=str_replace("/","createfrom",$mime);
$outFun=str_replace("/",null,$mime);
不同之处:
//创建原画布资源和目标画布资源
$src_iamge=$createFun($filename);
$dst_iamge=imagecreatetruecolor($dst_w,$dst_h);
imagecopyresampled($dst_iamge,$src_iamge,0,0,0,0,$dst_w,$dst_h,$src_w,$src_h);
$outFun($dst_iamge,"iamges/test_thumb.jpg");
4.3 文字水印效果的实现
//详见waterMarking.php,其中imagecolorallocatealpha($image,$red,$green,$blue,$alpha)表示为一幅图像分配颜色,其中alpha重0-127,0表示完全不透明。如果分配失败则返回FALSE
$filename="images/1.jpeg";
$fileInfo=getimagesize($filename);
$mime=$fileInfo["mime"];
$createFun=str_replace("/","createfrom",$mime);
$outFun=str_replace("/",null,$mime);
$image=$createFun($filename);
$red=imagecolorallocate($image,255,0,0);
$fontfile="fonts/Kaiti.ttc";
imagettftext($image,30,0,0,30,$red,$fontfile,"FZ杰哥的水印");
header("content-type:",$mime);
$outFun($image);
imagedestroy($image);
4.4 图片水印效果的实现
//详见waterPic.php
$logo="image/jd.png";
$filename="images/1.jpeg";
$dst_img=imagecreatefromjpeg($filename);
$src_img=imagecreatefrompng($logo);
imagecopymerge($dst_img,$src_img,0,0,0,0,270,60,100);
header("content-type:image/jpeg");
imagejpeg($dst_img);
imagedestroy($src_img);
imagedestroy($dst_img);
4.5缩略图和水印封装及测试
- 创建缩略图函数,详见文件image.func.php的thumb()函数
- 封装文字水印函数,详见文件image.func.php的water_text()函数
- 图片水印函数,详见文件image.func.php的water_pic()函数
- 缩略图和水印封装测试案例,详见testImageFunc.php
以上是 PHP之GD库案例实战 的全部内容, 来源链接: utcz.com/z/515416.html