Home >Backend Development >PHP Tutorial >php 图片操作类,支持生成缩略图,添加水印,上传缩略图
class Image {
//类开始
public $originimage = "" ; //源图片文件地址
public $imageext = "" ; //源图片格式
public $thumbimage = "" ; //缩略图文件存放地址
public $thumb_maxwidth = 1440; //缩略图最大宽度
public $thumb_maxheight = 900; //缩略图最大高度
public $watermark_text = "" ; //水印文字内容
public $watermark_minwidth = 300; //源图片最小宽度:大于此值时加水印
public $watermark_minheight = 200; //源图片最小高度:大于此值时加水印
public $watermark_fontfile = "" ; //字体文件
public $watermark_fontsize = 14; //字体大小
public $watermark_logo = "config/water.png" ; //水印LOGO地址
public $watermark_transparent = 20; //水印LOGO不透明度
private $origin_width = 0; //源图片宽度
private $origin_height = 0; //源图片高度
private $imageQuilty = 90; //图片质量
private $tmp_originimage = "" ; //临时图片(源图片)
private $tmp_thumbimage = "" ; //临时图片(缩略图)
private $tmp_waterimage = "" ; //临时图片(水印LOGO)
private $_waterPosition = 2; //1正中间 2右下角
//生成缩略图
public function gen_thumbimage() {
if ( $this ->originimage == "" || $this ->thumbimage == "" ) {
return 0;
}
$this ->get_oriwidthheight ();
if ( $this ->origin_width thumb_maxwidth && $this ->origin_height thumb_maxheight) {
$this ->thumb_maxwidth = $this ->origin_width;
$this ->thumb_maxheight = $this ->origin_height;
} else {
if ( $this ->origin_width origin_height) {
$this ->thumb_maxwidth = ( $this ->thumb_maxheight / $this ->origin_height) * $this ->origin_width;
} else {
$this ->thumb_maxheight = ( $this ->thumb_maxwidth / $this ->origin_width) * $this ->origin_height;
}
}
$this ->get_imagetype ();
$this ->gen_tmpimage_origin ();
$this ->gen_tmpimage_thumb ();
if ( $this ->tmp_originimage == "" || $this ->tmp_thumbimage == "" ) {
return - 1;
}
imagecopyresampled ( $this ->tmp_thumbimage, $this ->tmp_originimage, 0, 0, 0, 0, $this ->thumb_maxwidth, $this ->thumb_maxheight, $this ->origin_width, $this ->origin_height );
switch ( $this ->imageext) {
case "gif" :
imagegif ( $this ->tmp_thumbimage, $this ->thumbimage );
return 1;
break ;
case "jpg" :
imagejpeg ( $this ->tmp_thumbimage, $this ->thumbimage, $this ->imageQuilty );
return 2;
break ;
case "png" :
imagepng ( $this ->tmp_thumbimage, $this ->thumbimage );
return 3;
break ;
default :
return - 2;
break ;
}
}
//添加文字水印
public function add_watermark1() {
if ( $this ->originimage == "" || $this ->watermark_text == "" || $this ->watermark_fontfile == "" ) {
return 0;
}
$this ->get_oriwidthheight ();
if ( $this ->origin_width watermark_minwidth || $this ->origin_height watermark_minheight) {
return 0;
}
$this ->get_imagetype ();
$this ->gen_tmpimage_origin ();
if ( $this ->tmp_originimage == "" ) {
return - 1;
}
$textcolor = imagecolorallocate ( $this ->tmp_originimage, 255, 0, 0 );
$angle = 0;
$px = $this ->origin_width / 2 - 200;
$py = $this ->origin_height / 2 - 10;
imagettftext ( $this ->tmp_originimage, $this ->watermark_fontsize, $angle , $px , $py , $textcolor , $this ->watermark_fontfile, $this ->watermark_text );
switch ( $this ->imageext) {
case "gif" :
imagegif ( $this ->tmp_originimage, $this ->originimage );
return 1;
break ;
case "jpg" :
imagejpeg ( $this ->tmp_originimage, $this ->originimage, $this ->imageQuilty );
return 2;
break ;
case "png" :
imagepng ( $this ->tmp_originimage, $this ->originimage );
return 3;
break ;
default :
return - 2;
break ;
}
}
//添加LOGO水印
public function add_watermark2() {
if ( $this ->originimage == "" || $this ->watermark_logo == "" ) {
return 0;
}
$this ->get_oriwidthheight ();
if ( $this ->origin_width watermark_minwidth || $this ->origin_height watermark_minheight) {
return 0;
}
$this ->get_imagetype ();
$this ->gen_tmpimage_origin ();
$this ->gen_tmpimage_waterlogo ();
if ( $this ->tmp_originimage == "" || $this ->tmp_waterimage == "" ) {
return - 1;
}
list ( $logo_width , $logo_height ) = getimagesize ( $this ->watermark_logo );
//正中间
$waterZb = $this ->waterPosition ( $logo_width , $logo_height );
$px = $waterZb [ 'x' ];
$py = $waterZb [ 'y' ];
imagecopymerge ( $this ->tmp_originimage, $this ->tmp_waterimage, $px , $py , 0, 0, $logo_width , $logo_height , $this ->watermark_transparent );
switch ( $this ->imageext) {
case "gif" :
imagegif ( $this ->tmp_originimage, $this ->originimage );
return 1;
break ;
case "jpg" :
imagejpeg ( $this ->tmp_originimage, $this ->originimage, $this ->imageQuilty );
return 2;
break ;
case "png" :
imagepng ( $this ->tmp_originimage, $this ->originimage );
return 3;
break ;
default :
return - 2;
break ;
}
}
/**
* 上传缩略图
* 注意上传文件大小限制
*@param String $files $_FILES['upload'] 类型
*@param String $path 存储的目录 默认在/static/attached/
*@param boolean $isWater 是否添加水印
* @return string $filePath 网页url图片路径
*/
public function upload( $files , $path , $isWater ) {
if ( is_uploaded_file ( $files [ 'tmp_name' ] )) {
$upfile = $files ;
$name = $upfile [name];
$type = $upfile [type];
$size = $upfile [size];
$tmp_name = $upfile [tmp_name];
$error = $upfile [error];
if ( $size > 1048576) {
return array ( 'status' => false, 'message' => "$name图片太大超过1MB" );
}
$rs = $this -> getImageSize ( $tmp_name );
if (! $rs [ 'status' ]) {
$rs [ 'message' ] = $name . $rs [ 'message' ];
return $rs ;
}
// 创建文件夹
$save_path = getcwd () . "/static/attached/" . $path . "/" ;
$save_url = "./static/attached/" . $path . "/" ;
$ym = date ( "Ym" );
$save_path .= $ym . "/" ;
$save_url .= $ym . "/" ;
if (! file_exists ( $save_path )) {
mkdir ( $save_path );
}
if ( $error == '0' ) {
$fileType = substr ( $name , strpos ( $name , "." ) + 1 );
$prefix = $this ->getRandPrefix ();
$newName = date ( "YmdHi" ) . $prefix . "." . $fileType ;
$filepath = $save_path . $newName ;
move_uploaded_file ( $tmp_name , $filepath );
}
if ( $isWater ) {
$this ->water ( $filepath );
}
return array ( 'status' => true, 'message' => $save_url . $newName );
}
}
/**
* 图片增加水印处理
* @param unknown_type $image
*/
public function water( $image ) {
$this ->watermark_logo = ROOT . $this ->watermark_logo;
$this ->originimage = $image ;
//LOGO水印
$this ->add_watermark2 ();
}
/**
*
* 获取随机前缀
*/
private function getRandPrefix() {
$string = "abcdefghijklmnopqrstuvwxyz0123456789" ;
$prefix = '' ;
for ( $i = 0; $i
$rand = rand ( 0, 33 );
$prefix .= $string { $rand };
}
return $prefix ;
}
//检测图片大小
private function getImageSize ( $image ) {
list ( $width , $height , $type , $attr ) = getimagesize ( $image );
if ( $type != 2 && $type != 3) {
return array ( 'status' => false, 'message' => "图片格式不正确,请上传JPG或者PNG图片" . $type );
}
//检测图片大小
if ( $width > 1440) {
return array ( 'status' => false, 'message' => "图片宽度请小于1440px,当前为" . $width . "px" );
}
if ( $height > 900) {
return array ( 'status' => false, 'message' => "图片高度请小于900px,当前为" . $height . "px" );
}
return array ( 'status' => true );
}
/**
* 生成缩略图
*
* @param String $imagefile 原始文件
* @param String $thumbWidth 缩略图宽度
* @param String $thumbHeight 缩略图高度
* @return String 缩略图url
*/
public function reduceImage( $imagefile , $thumbWidth , $thumbHeight , $path = "thumb" ) {
// 生成缩略图
$dir = date ( "Ym" , time () );
$imagefile = ROOT . $imagefile ;
$imagefile_s = ROOT . "static/attached/" . $path . "/" . $dir . "/s_" . basename ( $imagefile );
$imagetrans = new Image ();
$imagetrans ->originimage = $imagefile ;
$imagetrans ->thumbimage = $imagefile_s ;
$imagetrans ->thumb_maxwidth = $thumbWidth ;
$imagetrans ->thumb_maxheight = $thumbHeight ;
$isokid = $imagetrans ->gen_thumbimage ();
return "./static/attached/" . $path . "/" . $dir . "/s_" . basename ( $imagefile );
}
/**
* 水印位置
* @param int $logo_width
* @param int $logo_height
* @return 水印坐标
*/
private function waterPosition( $logo_width , $logo_height ) {
switch ( $this ->_waterPosition) {
case 1 :
$px = $this ->origin_width / 2 - $logo_width / 2;
$py = $this ->origin_height / 2 - $logo_height / 2;
break ;
case 2 :
$px = $this ->origin_width - $logo_width - 10;
$py = $this ->origin_height - $logo_height - 10;
break ;
default :
$px = $this ->origin_width / 2 - $logo_width / 2;
$py = $this ->origin_height / 2 - $logo_height / 2;
break ;
}
return array ( 'x' => $px , 'y' => $py );
}
//获取图片尺寸
private function get_oriwidthheight() {
list ( $this ->origin_width, $this ->origin_height ) = getimagesize ( $this ->originimage );
return 1;
}
/*
* 检测图片格式
* 原方法需要开启exif 扩展
*/
private function get_imagetype() {
$ext = $this ->getImgext ( $this ->originimage );
switch ( $ext ) {
case 1 :
$this ->imageext = "gif" ;
break ;
case 2 :
$this ->imageext = "jpg" ;
break ;
case 3 :
$this ->imageext = "png" ;
break ;
default :
$this ->imageext = "unknown" ;
break ;
}
}
//创建临时图片(源图片)
private function gen_tmpimage_origin() {
$ext = $this ->getImgext ( $this ->originimage );
switch ( $ext ) {
case 1 :
$this ->tmp_originimage = imagecreatefromgif ( $this ->originimage );
$bgcolor = imagecolorallocate ( $this ->tmp_originimage, 0, 0, 0 );
$bgcolortrans = imagecolortransparent ( $this ->tmp_originimage, $bgcolor );
break ;
case 2 :
$this ->tmp_originimage = imagecreatefromjpeg ( $this ->originimage );
break ;
case 3 :
$this ->tmp_originimage = imagecreatefrompng ( $this ->originimage );
imagesavealpha ( $this ->tmp_originimage, true );
break ;
default :
$this ->tmp_originimage = "" ;
break ;
}
}
//创建临时图片(缩略图)
private function gen_tmpimage_thumb() {
$ext = $this ->getImgext ( $this ->originimage );
switch ( $ext ) {
case 1 :
$this ->tmp_thumbimage = imagecreatetruecolor ( $this ->thumb_maxwidth, $this ->thumb_maxheight );
$bgcolor = imagecolorallocate ( $this ->tmp_thumbimage, 255, 255, 255 );
imagefill ( $this ->tmp_thumbimage, 0, 0, $bgcolor );
break ;
case 2 :
$this ->tmp_thumbimage = imagecreatetruecolor ( $this ->thumb_maxwidth, $this ->thumb_maxheight );
break ;
case 3 :
$this ->tmp_thumbimage = imagecreatetruecolor ( $this ->thumb_maxwidth, $this ->thumb_maxheight );
$bgcolor = imagecolorallocate ( $this ->tmp_thumbimage, 255, 255, 255 );
imagefill ( $this ->tmp_thumbimage, 0, 0, $bgcolor );
imagealphablending ( $this ->tmp_thumbimage, false );
imagesavealpha ( $this ->tmp_thumbimage, true );
break ;
default :
$this ->tmp_thumbimage = "" ;
break ;
}
}
//创建临时图片(LOGO水印)
private function gen_tmpimage_waterlogo() {
$ext = $this ->getImgext ( $this ->watermark_logo );
switch ( $ext ) {
case 1 :
$this ->tmp_waterimage = imagecreatefromgif ( $this ->watermark_logo );
$bgcolor = imagecolorallocate ( $this ->tmp_waterimage, 0, 0, 0 );
$bgcolortrans = imagecolortransparent ( $this ->tmp_waterimage, $bgcolor );
break ;
case 2 :
$this ->tmp_waterimage = imagecreatefromjpeg ( $this ->watermark_logo );
break ;
case 3 :
$this ->tmp_waterimage = imagecreatefrompng ( $this ->watermark_logo );
imagesavealpha ( $this ->tmp_waterimage, true );
break ;
default :
$this ->tmp_waterimage = "" ;
break ;
}
}
/*
* 获取后缀名
*/
public function getImgext( $filename ) {
return exif_imagetype ( $filename );
}
//释放资源
public function __destruct() {
if ( is_object ( $this ->tmp_originimage ) == true) {
imagedestroy ( $this ->tmp_originimage );
}
if ( is_object ( $this ->tmp_thumbimage ) == true) {
imagedestroy ( $this ->tmp_thumbimage );
}
if ( is_object ( $this ->tmp_waterimage ) == true) {
imagedestroy ( $this ->tmp_waterimage );
}
}
}