PHP图像处理类库及演示分享
简单写了一个PHP的图像处理类库,虽然功能比较少,但是目前也没用到太高级的,以后用到了再填吧,或者哪位给点建议加上什么功能,或者有什么需求可以跟我说,我有时间加上,如果哪位对这个类库进行了扩展的话,还麻烦拿出来大家分享一下,代码现在是能用就行,考虑的东西不是很多,有什么更好的建议请告诉我,谢谢
Img.php
<?php
/**
*CreatedbyPhpStorm.
*User:MCtion
*Date:2015/5/140014
*Time:15:36
*简单的图像类库,本类中所有相对路径均基于网站根目录,如需修改,则修改常量__WEBROOT__即可
*功能:指定文字内容创建图片(不支持中文)、创建验证码图片、创建缩略图、其他功能待续
*方法:
*Style(array$Options)设置图片样式,每次设定前将重置为默认样式
*Create_Img_Png()创建PNG图像,相关属性由Style指定
*Create_Img_Jpeg()创建JPEG图像,相关属性由Style指定
*Create_Verify()创建验证码图像,相关属性由Style指定
*Get_Verify()获得创建的验证码值,MD5加密
*Load_Img(string$FilePath)加载图像,创建图像源,供其他方法调用源,FilePath为图像相对路径
*Create_Thumb(string$FileName,string$FilePath)创建由Load_Img()加载的图像的缩略图,FileName为保存后的图像前缀,FilePath为保存图像的相对路径,不包含文件名(例:/Uploads/images/Thumb/)
*/
if(!defined("__WEBROOT__"))define("__WEBROOT__",$_SERVER['DOCUMENT_ROOT']);
classImg{
protected$_Img;//图片源
protected$_FileImg;//加载的图片源
protected$_FileInfo;//加载的图片的信息数组
protected$_PicInfo;//加载的图片的宽高等信息数组
protected$_Rand='abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ1234567890';//随机因子
protected$_Code='';//验证码
public$Width=300;//图片默认宽
public$Height=80;//图片默认高
public$BackgroundColor="000000";
public$Font="/phps/Public/Font/ARIALNB.TTF";//默认字体
public$FontSize=16;//默认字体字号
public$FontColor="ffffff";//默认字体颜色
public$Content="TestWord";
public$Align="left";
public$Codes=4;//验证码个数
public$Line=6;//干扰线条的个数
public$LoadErr='';//错误信息
//publicfunction__construct(){}
/**设置图片属性
*@paramarray$Options属性数组
*@return$this返回对象
*/
publicfunctionStyle($Options){
$this->_Re_Set();
foreach($Optionsas$K=>$V){
if(in_array($K,array('Width','Height','BackgroundColor','Font','FontSize','FontColor','Content','Align','Codes','Line','Snow'))){
if($K=="BackgroundColor"||$K=="FontColor"){
if(preg_match("#([a-zA-Z0-9]{6})#",$V))$this->$K=$V;
}else{
$this->$K=$V;
}
}
}
return$this;
}
/**
*重置属性,不提供外部访问
*/
protectedfunction_Re_Set(){
$this->Width=100;
$this->Height=30;
$this->BackgroundColor="000000";
$this->Font="/phps/Public/Font/ARIALNB.TTF";
$this->FontSize=16;
$this->FontColor="ffffff";
$this->Align="left";
$this->Codes=4;
$this->Line=6;
}
/**
*创建图像源、添加背景、创建图像
*@parambool$BGC指定是否创建背景色及矩形块
*/
protectedfunction_Create_Img_GB($BGC=True){
$this->_Img=imagecreatetruecolor($this->Width,$this->Height);//创建背景源
if($BGC){
preg_match("#([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})#",$this->BackgroundColor,$ColorArr);//将颜色值分隔成三组16位进制数
$Color=imagecolorallocate($this->_Img,hexdec($ColorArr[1]),hexdec($ColorArr[2]),hexdec($ColorArr[3]));//给Img图像源添加背景色
imagefilledrectangle($this->_Img,0,$this->Height,$this->Width,0,$Color);//创建图像
}
}
/**
*创建随机验证码
*/
protectedfunction_Create_Code(){
$Len=strlen($this->_Rand)-1;
for($i=0;$i<$this->Codes;$i++){
$this->_Code.=$this->_Rand[mt_rand(0,$Len)];
}
}
/**
*向图像中写入字符串,暂不支持中文
*/
protectedfunction_Write_Text(){
$FontWidth=imagefontwidth($this->FontSize);//获取字号的一个字符的宽度
preg_match_all('/(.)/us',$this->Content,$TextArr);//将内容分隔成数组一遍统计个数
$FontHeight=imagefontheight($this->FontSize);//获取字号的高度
$X=ceil(($this->Width-($FontWidth*count($TextArr[0])))/2);//设置X轴距左边距的距离
$Y=ceil(($this->Height+$FontHeight)/2);//设置Y轴距上边距的距离
preg_match("#([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})#",$this->FontColor,$ColorArr);
$Color=imagecolorallocate($this->_Img,hexdec($ColorArr[1]),hexdec($ColorArr[2]),hexdec($ColorArr[3]));//设置文字颜色
imagettftext($this->_Img,$this->FontSize,0,$X,$Y,$Color,__WEBROOT__.$this->Font,$this->Content);//写入内容
}
/**
*向图像中写入验证码
*/
protectedfunction_Write_Code(){
$_X=$this->Width/$this->Codes;//设置宽高比
for($i=0;$i<$this->Codes;$i++){//循环Codes次,每次生成一位验证码值
$Color=imagecolorallocate($this->_Img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));//随机生成验证码值的颜色
imagettftext($this->_Img,$this->FontSize,mt_rand(-30,30),$_X*$i+mt_rand(1,5),$this->Height/1.3,$Color,__WEBROOT__.$this->Font,$this->_Code[$i]);//生成一位验证码值
}
}
/**
*向图像中写入干扰线条
*/
protectedfunction_Write_Line(){//生成干扰线条
for($i=0;$i<$this->Line;$i++){
$Color=imagecolorallocate($this->_Img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
imageline($this->_Img,mt_rand(0,$this->Width),mt_rand(0,$this->Height),mt_rand(0,$this->Width),mt_rand(0,$this->Height),$Color);
}
}
/**
*设置图像类型为JPEG
*/
protectedfunction_Img_Jpeg(){
header('Content-type:image/jpeg');
imagejpeg($this->_Img);
imagedestroy($this->_Img);
}
/**
*设置图像类型为PNG
*/
protectedfunction_Img_Png(){
header('Content-type:image/png');
imagepng($this->_Img);
imagedestroy($this->_Img);
}
/**
*创建JPEG的字符串图像
*/
publicfunctionCreate_Img_Jpg(){
$this->_Create_Img_GB(True);
$this->_Write_Text();
$this->_Img_Jpeg();
}
/**
*创建PNG的字符串图像
*/
publicfunctionCreate_Img_Png(){
$this->_Create_Img_GB(True);
$this->_Write_Text();
$this->_Img_Png();
}
/**
*创建验证码的PNG图像
*/
publicfunctionCreate_Verify(){
$this->BackgroundColor='';
for($I=0;$I<3;$I++){
$this->BackgroundColor.=dechex(mt_rand(20,155));
}
$this->_Create_Img_GB(True);
$this->_Create_Code();
$this->_Write_Line();
$this->_Write_Code();
$this->_Img_Png();
}
/**
*外部获取MD5加密后的验证码
*@returnstring
*/
publicfunctionGet_Verify(){
returnmd5($this->_Code);
}
/**
*加载一个图像文件,并获取图像相关信息
*@paramstring$FilePath图像相对路径地址
*@return$this|bool成功返回对象,否则返回FALSE
*/
publicfunctionLoad_Img($FilePath){
$FilePath=__WEBROOT__.$FilePath;
if(!is_file($FilePath)){
$this->LoadErr="路径错误,文件不存在";
ReturnFalse;
}
$this->_PicInfo=getimagesize($FilePath);
$this->_FileInfo=pathinfo($FilePath);
switch($this->_PicInfo[2]){
case1:$this->_FileImg=imagecreatefromgif($FilePath);break;
case2:$this->_FileImg=imagecreatefromjpeg($FilePath);break;
case3:$this->_FileImg=imagecreatefrompng($FilePath);break;
default:$this->LoadErr="类型错误,不支持的图片类型";ReturnFalse;
}
ReturnTrue;
}
/**
*创建缩略图
*@paramstring$FileName保存的图片名称前缀
*@paramstring$FilePath保存图片的相对路径
*@returnmixed返回生成的图片的信息数组
*/
publicfunctionCreate_Thumb($FileName,$FilePath){
$SavePath=__WEBROOT__.$FilePath;
if(!file_exists($SavePath)){
mkdir($SavePath,0777,true);
}
$FileName=$FileName.date("YmdHis").rand(100,999).'.'.$this->_FileInfo['extension'];
$FilePath=$FilePath.$FileName;
$SavePath=$SavePath.$FileName;
$this->_Create_Img_GB(False);
imagecopyresampled($this->_Img,$this->_FileImg,0,0,0,0,$this->Width,$this->Height,$this->_PicInfo[0],$this->_PicInfo[1]);
switch($this->_PicInfo[2]){
case1:imagegif($this->_Img,$SavePath);break;
case2:imagejpeg($this->_Img,$SavePath);break;
case3:imagepng($this->_Img,$SavePath);break;
}
$FIleInfo['FileName']=$FileName;
$FIleInfo['FilePath']=$FilePath;
Return$FIleInfo;
}
}
使用示例
$Img=newImg();
$Options['Width']=300;
$Options['Height']=100;
$Options['Content']="TestCreateImg";
$Options['FontColor']="FF0000";
$Options['BackgroundColor']="AAAAAA";
$Img->Style($Options)->Create_Img_Jpg();
if($Img->Load_Img("/Public/images/ad1.png")){
$FileInfo=$Img->Style(array('Width'=>30,'Height'=>30))->Create_Thumb("Thumb","/Uploads/images/");
var_dump($FileInfo);
}else{
die("加载图像失败,".$Img->LoadErr);
}
以上所述就是本文的全部内容了,希望大家能够喜欢。