要写php对于图片的处理类,首先必须对于php对于图片的处理有一个了解,php对于图片的处理,其实也就是gd2,首先我们需要在php.ini里面开启对于gd2库的支持(具体百度)不是此文的重点。
首先,在画图,我们必须要有一个画板(也可以说是纸张)吧,这个画板我们可以自己做一个,使用
里面我们就取索引0(宽),1(高),mime(这里要处理一下,得出图片的后缀ext)
这个图片信息方法是为下面这两个方法而服务的
一、加水印:
对于这方法也不需要介绍过多,首先是你要有一个需要添加水印的图片1,然后水印图2一张(必须小于前者)因为注释里面都有详细的描述了,只是对于关键的函数进行一下说明
生成缩略图需要注意的问题就比较多了,首先你必须要确定缩略比例,因为我们不想图片变形,所以我们采取的缩率比例是缩率高/原高=比例1,缩率宽/原宽=比例2里面比例值低的一项,这样缩放就会因为原图的比例可能与缩略图的比例不一致导致缩略图会产生上下或者左右白边的情况(也就是图片在画图的位置不在是0,0),那么这个位置要在哪里,参照上面方法中的计算方法,如不清楚自己画图来理解,文字上比较难描述,然后这些都确定以后我们才可以进行缩略图的制作,函数为
resource
imagecreatetruecolor (int
那么有纸有笔了,我们就可以开始作画了,在PHP中,作画的函数多如牛毛,我在这里只用其中一个作为例子bool
imageline ( resource
画完画以后我们该怎么处理这幅画呢,有两种处理方法,一个是保存好,一个是直接输出,函数为
$x_size
, int
$y_size
),这个函数让我们可以自己建一个黑色背景的一定义长款的画板,返回一个资源型(画板资源),或者,我们有一张图,我们可以直接调用这个图用作画板,其实也就是直接用这个图做背景resource
imagecreatefromxxx( string
$filename
),xxx代表这个图片的格式(jpeg\gif等),然后我们有了画板,我们还需要画笔吧int
imagecolorallocate (resource
$image
, int
$red
, int
$green
, int
$blue
),这个是使用标准RGB来生成一个画笔。
$image
, int
$x1
, int
$y1
, int
$x2
, int
$y2
, int
$color
),这个函数是在画板上面画一条线,从坐标
x1
,
y1
到
x2
,
y2
(图像左上角为 0, 0)画一条线段。
bool
imagexxx ( resource
因为图片是十分占据资源的,所以我们在不再使用的时候必须对资源进行销毁bool
imagedestroy (resource
至此,基本的图片方法处理就叙述完毕,但是具体的应用还是还是相当的复杂的,下面以加水印和缩略图为主要功能写的一个图片处理类ImageTool.class.php
首先,我们要处理图片,必须要获得图片的信息,先写一个方法,获取图片的关键信息
$image
[, string
$filename
[, int
$quality
]]),xxx和上面同理,是以什么格式输出保存图片,而后面有两个参数,第一个就是画布资源,第二个不填就直接输出到浏览器,填写了路径就保存到该路径里面。这里有一个需要注意的地方,我们输出到浏览器的时候,我们要先告诉浏览器我们即将输出的是图片和告知其图片格式才可以正常进行输出header('content-type:image/xxx')xxx为图片格式。
$image
);
public static function getInfo($path){
//判断图片是否存在
if(!file_exists($path)){
return false;
}
$info = getimagesize($path);
//判断是否能读出正确的图片信息
if($info == false){
return false;
}
//读取图片信息
$img['width'] = $info[0];
$img['height'] = $info[1];
$ext = explode('/',$info['mime']);
$img['ext'] = end($ext);
return $img;
}
其实这个方法里面最关键的一个就是array
getimagesize ( string
$filename
[, array
&$imageinfo
]),这个方法会返回一个数组,里面包含这个图片的各种信息:
- 索引 0 给出的是图像宽度的像素值
- 索引 1 给出的是图像高度的像素值
- 索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 =PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byteorder),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 =WBMP,16 = XBM
- 索引 3 给出的是一个宽度和高度的字符串,可以直接用于 HTML 的<image> 标签
- 索引 bits 给出的是图像的每种颜色的位数,二进制格式
- 索引 channels 给出的是图像的通道值,RGB 图像默认是 3
- 索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type头信息中发送正确的信息,如:header("Content-type: image/jpeg")
这个图片信息方法是为下面这两个方法而服务的
一、加水印:
public static function water($re,$water,$save,$pos=2,$per=50){
//判断两个图片文件是否存在
if(!file_exists($re) || !file_exists($water)){
return false;
}
//获取两个图片的信息
$rinfo = self::getInfo($re);
$winfo = self::getInfo($water);
//判断图片是否大于水印图片
if($rinfo['width'] < $winfo['width'] || $rinfo['height'] < $winfo['height']){
return false;
}
//根据$pos的传值讨论水印的位置
switch($pos){
case 0:
$rex = 0;
$rey = 0;
break;
case 1:
$rex = $rinfo['width'] - $winfo['width'];
$rey = 0;
break;
case 2:
$rex = $rinfo['width'] - $winfo['width'];
$rey = $rinfo['height'] - $winfo['height'];
break;
case 3:
$rex = 0;
$rey = $rinfo['height'] - $winfo['height'];
break;
}
//根据后缀生成获取图片函数
$funcre = 'imagecreatefrom' . $rinfo['ext'];
$funcwater ='imagecreatefrom' . $winfo['ext'];
//判断生成函数是否可用
if(!function_exists($funcre) || !function_exists($funcwater)){
return false;
}
$reim = $funcre($re);
$waim = $funcwater($water);
//添加水印
imagecopymerge ( $reim , $waim , $rex , $rey , 0 , 0 , $winfo['width'] , $winfo['height'] , $per );
//判断路径
if(!$save){
$save = $re;
unlink($re);//删除原图
}
//生成图片保存函数
$createfunc = 'image' . $rinfo['ext'];
//保存图片
$createfunc($reim,$save);
imagedestroy($reim);
imagedestroy($waim);
return true;
}
对于这方法也不需要介绍过多,首先是你要有一个需要添加水印的图片1,然后水印图2一张(必须小于前者)因为注释里面都有详细的描述了,只是对于关键的函数进行一下说明
bool
imagecopymerge ( resource
二、缩略图
$dst_im
, resource
$src_im
, int
$dst_x
, int
$dst_y
, int
$src_x
, int
$src_y
, int
$src_w
, int
$src_h
, int
$pct
)参数虽然看起来很多,但是只要理解了,也并不复杂,第一第二就对应上面的图1和图2,然后添加的位置x,y,再到从图片二的x,y开始截取w高,h宽作为水印,最后一个参数是水印的透明度(0最低也即是看不到,100最高也完全不透明)。
public static function thumb($re,$save=NUlL,$width=200,$height=200){
//判断图片是否存在
if(!file_exists($re)){
return false;
}
//创建一个目标画布
$im = imagecreatetruecolor($width,$height);
//白色画笔
$white = imagecolorallocate($im,255,255,255);
//给目标画布上色
imagefill($im,0,0,$white);
//获取图片信息
$info = self::getInfo($re);
//从图片信息中获取宽高计算缩放比例
$wpre = $width/$info['width'];
$hpre = $height/$info['height'];
//根据两个来决定最终缩放
$pre = $wpre < $hpre?$wpre:$hpre;
//计算缩放后的长宽
$imwidth = $info['width'] * $pre;
$imheight = $info['height'] * $pre;
//计算目标画布的位置
$x = ($width - $imwidth)/2;
$y = ($height - $imheight)/2;
//创建原始画布
$createfunc = 'imagecreatefrom' . $info['ext'];
if(!function_exists($createfunc)){
return false;
}
$reim = $createfunc($re);
//进行缩放
imagecopyresampled($im,$reim,$x,$y,0,0,$imwidth,$imheight,$info['width'],$info['height']);
//判断路径是否存在
if(!$save){
$save = $re;
unlink($re);//删除原来的图片
}
//保存图片
$createfunc = 'image' . $info['ext'];
$createfunc($im,$save);
imagedestroy($im);
imagedestroy($reim);
return true;
}
生成缩略图需要注意的问题就比较多了,首先你必须要确定缩略比例,因为我们不想图片变形,所以我们采取的缩率比例是缩率高/原高=比例1,缩率宽/原宽=比例2里面比例值低的一项,这样缩放就会因为原图的比例可能与缩略图的比例不一致导致缩略图会产生上下或者左右白边的情况(也就是图片在画图的位置不在是0,0),那么这个位置要在哪里,参照上面方法中的计算方法,如不清楚自己画图来理解,文字上比较难描述,然后这些都确定以后我们才可以进行缩略图的制作,函数为
bool
imagecopyresampled (resource
通过这个图片处理类,在商城中就可以对上传的文件进行缩率存放,以便于使用。
$dst_image
, resource
$src_image
, int
$dst_x
, int
$dst_y
, int
$src_x
, int
$src_y
, int
$dst_w
, int
$dst_h
, int
$src_w
, int
$src_h
)参数看起来也比较多,需要理解去记忆,第一第二个和上面水印同理,对于缩略图和原图,然后是缩略图所在画板位置的xy,再到截取原图的开始点xy,缩略图的宽高wh最后到原图截取的宽高wh.方法中是一连串的计算最后得出的这些参数具体值,需要画图去理解,单从文字上比较难理解。