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

回到顶部