<?php
header("content-type:text/html;charset=utf-8");
/**
- 图像处理类 完成对各种类型的图像进行等比缩放,加图片水印和裁剪的操作
- @author Administrator
-
.jpg .png .gif 经过测试
*/
class Image{private $path;//待操作图片的路径
/**
- 构造函数用来创建图像的一个目录,默认值是当前目录
*/
function __construct($path='./'){
if (!file_exists($path)){ //检查输入的路径是否正确
die("找不到,输入的不是一个正确路径!");
}
$this->path=$path;
}
/**
- 对图像缩放的处理
- @param int $width //缩放后的宽度
- @param int $height //缩放后的高度
- @param string $name //缩放后生成的文件名称前缀(+原来的文件名)
-
@备注 如果此方法 出现了报错 很有可能是图片本身的格式被篡改
*/
function suofang($width,$height,$name){
list($src_width,$src_height)=getimagesize($this->path);//获得原图片的高宽
if($width>$src_width$height>$src_height){
die ("输入错误,缩放后的宽度和高度不能大于图片本身的高度 和宽度");
}
$dst_image=imagecreatetruecolor($width, $height);//创建缩放后的画布资源
$path= "imagecreatefrom".$this->file_type($this->path);
$src_image=$path($this->path); //原图片资源imagecopyresized($dst_image, $src_image, 0, 0, 0, 0, $width, $height, $src_width, $src_height);
$path1="image".$this->file_type($this->path);//类似于imagejpeg();
$name=$name.basename($this->path);//组合新的文件名称
if($path1($dst_image,dirname($this->path)."/".$name)){
echo "图片缩放操作成功!";
}else{
echo "图片缩放操作失败!请检查源代码";
}
//关闭img图像资源
imagedestroy($dst_image);
imagedestroy($src_image);
}
/** - 本类为图片增加图片或文字水印
- @param int $mode (1 or 2 ) 模式 1:为图片添加字符串水印,2:为图片添加图片水印
- @param string $content 若第一个参数 为1,则$content为待添加的字符串或图片地址
- @param int $position 位置1~9分别代表了左上角到右下角 依次类推
-
@param string $name 生成的带水印图片的名称
*/
function shuiyin_ImgOrText($mode,$content,$position,$name){
if($mode!=1&&$mode!=2){
die ("第一个参数必须为1 or 2");
}elseif($mode==1){
$path1="imagecreatefrom".$this->file_type($this->path);
$image=$path1($this->path);
$size=50;
//$content=iconv("GB2312", "UTF-8",$content); //调整编码问题为防止有中文出现会有乱码问题
$red=imagecolorallocate($image, 255, 0, 0);
if(!copy("C:\WINDOWS\Fonts\simsun.ttc", "./simsun.ttc")){ //将字体配置文件simsun.ttc复制到工作目录下
die("字体配置导入失败!");} $fontfile="simsun.ttc"; if($position<1$position>9){ die("第三个参数必须是1~9的数字"); } $arr=array(); $arr=$this->position($position); imagettftext($image, $size, 0, $arr[0], $arr[1], $red, $fontfile, $content); $path="image".$this->file_type($this->path); if($path($image,dirname($this->path)."/".$name.basename($this->path))){ echo "增加文字水印成功!"; }else{ echo "增加文字水印失败!"; } imagedestroy($image);
}elseif($mode==2){ //增加图片水印
if(!file_exists($content)){
die ("没有查找到该文件");
}
$path1="imagecreatefrom".$this->file_type($this->path);
$image1=$path1($this->path); //源图片(待增加水印)
$path="imagecreatefrom".$this->file_type($content);
$image=$path($content);
$arr=array();
$arr=$this->position($position);//自设参数 $src_x=200; //水印图从距(0,0)横坐标为200的地方开始截取 $src_y=200; //水印图从距(0,0)纵坐标为200的地方开始截取 $src_w=200; //截取水印图的宽度 $src_h=200; //截取水印的高度 imagecopy($image1, $image, $arr[0],$arr[1], $src_x, $src_y, $src_w, $src_h); $paths= "image".$this->file_type($this->path); if($paths($image1,dirname($this->path)."/".$name.basename($this->path))){ echo "增加文字水印成功!"; }else{ echo "增加文字水印失败!"; } imagedestroy($image1); imagedestroy($image);
}
}
/**
- @param int $src_x 裁剪距上边的距离
- @param int $src_y 裁剪距左边的距离
- @param int $src_w 裁剪的k宽度
- @param int $src_h 裁剪的高度
-
@param string $name
*/
function img_jianqie($src_x,$src_y,$src_w, $src_h,$name){
$dst_image=imagecreatetruecolor($src_w, $src_h);
list($width1,$height1)=getimagesize($this->path);
if($src_w>$width1$src_h>$height1){
die("错误!指定的宽和高大于原图片的宽高");
}
$path="imagecreatefrom".$this->file_type($this->path);
$src_image=$path($this->path);
imagecopyresampled($dst_image, $src_image, 0, 0, $src_x, $src_y, $src_w, $src_h, $src_w, $src_h);
$path1="image".$this->file_type($this->path);
if($path1($dst_image,dirname($this->path)."/".$name.basename($this->path))){echo "图片剪切操作成功!";
}else{
echo "图片剪切操作失败!";
}
imagedestroy($dst_image);
imagedestroy($src_image);
}
/**
- 根据$position来确定水印的位置 1~9 九宫格 从左上 到右下
-
@param int $position 位置标符
/
private function position($position){
$arr=array();
list($width,$height)=getimagesize($this->path);
$a=60; //初始位于图片边缘的间隔
switch($position){
case 1: $x=$y=$a; break;
case 2: $x=$width/3+$a;$y=$a;break;
case 3: $x=$width/32+$a;$y=$a;break;
case 4: $x=$a;$y=$height/3+$a;break;
case 5: $x=$width/3+$a;$y=$height/3+$a;break;
case 6: $x=$width/32+$a;$y=$height/3+$a;break;
case 7: $x=$a;$y=$height/32+$a;break;
case 8: $x=$width/3+$a;$y=$height/32+$a;break;
case 9: $x=$width/32+$a;$y=$height/3*2+$a;break;
default: die("发生了错误!");
}$arr[]=(int)$x;
$arr[]=(int)$y;
return $arr;
}
/**
- 判断图片为什么类型
- @param string $url 为文件路径
-
@return string $type 文件类型
*/
private function file_type($url){$url= substr($url, strtolower(strrpos($url,'.')+1)); //截取字符串获得 后缀
$url=='jpg'?$url='jpeg':$url;
return $url;
}
/**-
错误处理类
*/
private function error(){
error_reporting(0); //关闭所有错误报告!/**
- @param int $error_level 错误级别
- @param string $error_message 错误信息
- @param string $file 错误发生的文件
- @param unknown $line 错误的行号
*/
function error_handler($error_level,$error_message,$file,$line){
switch ($error_level){
case E_NOTICE:
case E_USER_NOTICE:
$error_type='notice';break;
case E_WARNING:
case E_USER_WARNING:
$error_type='WARNING';break;
case E_ERROR:
case E_USER_ERROR:
$error_type='error';break;
default:
$error_type='unknown';
}
$message="时间为:".date("Y-m-d H:i:s"). "发生了".$error_type."错误在第".$file."文件的".$line."行,错误信息为:".$error_message."\r\n";
error_log($message,3,"./error.text"); //发送错误指令 到指定的文件夹中
}
set_error_handler("error_handler"); //调用自设的回调函数 处理出错的信息
}
- 构造函数用来创建图像的一个目录,默认值是当前目录
}
$cheng =new Image("d:/img/3.jpg"); //待操作的图片路径
//$cheng ->suofang(200,200,'sf'); //对图片进行缩放操作
//$cheng ->shuiyin_ImgOrText(1, '我就是水印', 6, 'sy');//对图片增加水文字水印的操作
//$cheng ->shuiyin_ImgOrText(2, "d:/img/3.jpg", 6, 'sy');//对图片增加图片水印的操作
$cheng->img_jianqie(200, 200, 300, 300, 'jq'); //对图片进行剪切