首页 > 网站 > 建站经验 > 正文

常用的php图片处理类(水印、等比缩放、固定高宽)分享

2024-04-25 20:37:32
字体:
来源:转载
供稿:网友

常用的php图片处理类(水印、等比缩放、固定高宽)分享

<?php

//PHP 添加水印 & 比例缩略图 & 固定高度 & 固定宽度 类。

class Image_process{

public $source; //原图

public $source_width; //原图宽度

public $source_height; //原图高度

public $source_type_id;

public $orign_name;

public $orign_dirname;


//传入原图路径

public function __construct($source){

$this->typeList = array(1=>'gif',2=>'jpg',3=>'png');

$ginfo = getimagesize($source);

$this->source_width = $ginfo[0];

$this->source_height = $ginfo[1];

$this->source_type_id = $ginfo[2];

$this->orign_url = $source;

$this->orign_name = basename($source);

$this->orign_dirname = dirname($source);

}

//判断图片的文件的格式,返回PHP可识别的编码

public function judgeType($type,$source){

if($type == 1){

return imagecreatefromgif($source); //gif

}else if($type == 2){

return imagecreatefromjpeg($source); //jpg

}else if($type == 3){

return imagecreatefrompng($source); //png

}else{

return false;

}

}

//生成水印图片

public function waterMakeImage($logo){

$linfo = getimagesize($logo);

$logo_width = $linfo[0];

$logo_height = $linfo[1];

$logo_type_id = $linfo[2];

$sourceHandle = $this->judgeType($this->source_type_id,$this->orign_url);

$logoHandle = $this->judgeType($logo_type_id,$logo);

if(!$sourceHandle || !$logoHandle){

return false;

}

$x = ($this->source_width - $logo_width)/2;

$y = ($this->source_height - $logo_height)/2;

imagecopy($sourceHandle,$logoHandle,$x,$y,0,0,$logo_width,$logo_height);

$newPic = $this->orign_dirname.'/water_'.time().'.'.$this->typeList[$this->source_type_id];

if($this->saveImage($sourceHandle,$newPic)){

imagedestroy($sourceHandle);

imagedestroy($logoHandle);

}

}

//固定高度宽度

public function fixSizeImage($width,$height){

if($width > $this->source_width) $this->source_width;

if($height > $this->source_height) $this->source_height;

if($width === false){

$width = floor($this->source_width / ($this->source_height / $height));

}

if($height === false){

$height = floor($this->source_height / ($this->source_width / $width));

}

$this->tinyImage($width,$height);

}

//等比例缩放图片

public function scaleImage($scale){

$width = floor($this->source_width * $scale);

$height = floor($this->source_height * $scale);

$this->tinyImage($width, $height);

}

//创建缩略图

public function tinyImage($width,$height){

$tinyImage = imagecreatetruecolor($width,$height);

$handle = $this->judgeType($this->source_type_id,$this->orign_url);

if(function_exists('imagecopyresampled')){

imagecopyresampled($tinyImage, $handle, 0, 0, 0, 0, $width, $height, $this->source_width, $this->source_height);

}else{

imagecopyresized($tinyImage, $handle, 0, 0, 0, 0, $width, $height, $this->source_width, $this->source_height);

}

$newPic = $this->orign_dirname.'/thumb_'.time().'_'.$width."_".$height.".".$this->typeList[$this->source_type_id];

if($this->saveImage($tinyImage,$newPic)){

imagedestroy($tinyImage);

imagedestroy($handle);

}

}

//保存图片

private function saveImage($image,$url){

if(imagejpeg($image,$url)){

return true;

}
}

}

$imgHandle = new Image_process('D:/AppServ/www/test/getimg/14061907445601.jpg');

//$imgHandle->waterMakeImage('D:/AppServ/www/test/getimg/shougongke.png'); //生成水印图片

//$imgHandle->fixSizeImage(200,150); //固定长度图片

$imgHandle->scaleImage(0.2); //等比例缩放

?>

示例二:

<?php

/**

*

* 图像处理类

* @author FC_LAMP

* @internal功能包含:水印,缩略图

*/

class Img
{


//图片格式

private $exts = array ('jpg', 'jpeg', 'gif', 'bmp', 'png' );

/**

*

*

* @throws Exception

*/

public function __construct()

{

if (! function_exists ( 'gd_info' ))

{

throw new Exception ( '加载GD库失败!' );

}

}

/**

*

* 裁剪压缩

* @param $src_img 图片

* @param $save_img 生成后的图片

* @param $option 参数选项,包括: $maxwidth 宽 $maxheight 高

* array('width'=>xx,'height'=>xxx)

* @internal

* 我们一般的压缩图片方法,在图片过长或过宽时生成的图片

* 都会被“压扁”,针对这个应采用先裁剪后按比例压缩的方法

*/

public function thumb_img($src_img, $save_img = '', $option)

{

if (empty ( $option ['width'] ) or empty ( $option ['height'] ))

{

return array ('flag' => False, 'msg' => '原图长度与宽度不能小于0' );

}

$org_ext = $this->is_img ( $src_img );

if (! $org_ext ['flag'])

{

return $org_ext;

}

//如果有保存路径,则确定路径是否正确

if (! empty ( $save_img ))

{

$f = $this->check_dir ( $save_img );

if (! $f ['flag'])

{

return $f;

}

}

//获取出相应的方法

$org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );

//获取原大小

$source = $org_funcs ['create_func'] ( $src_img );

$src_w = imagesx ( $source );

$src_h = imagesy ( $source );

//调整原始图像(保持图片原形状裁剪图像)

$dst_scale = $option ['height'] / $option ['width']; //目标图像长宽比

$src_scale = $src_h / $src_w; // 原图长宽比

if ($src_scale >= $dst_scale)

{ // 过高

$w = intval ( $src_w );

$h = intval ( $dst_scale * $w );

$x = 0;

$y = ($src_h - $h) / 3;

} else

{ // 过宽

$h = intval ( $src_h );

$w = intval ( $h / $dst_scale );

$x = ($src_w - $w) / 2;

$y = 0;

}

// 剪裁

$croped = imagecreatetruecolor ( $w, $h );

imagecopy ( $croped, $source, 0, 0, $x, $y, $src_w, $src_h );

// 缩放

$scale = $option ['width'] / $w;

$target = imagecreatetruecolor ( $option ['width'], $option ['height'] );

$final_w = intval ( $w * $scale );

$final_h = intval ( $h * $scale );

imagecopyresampled ( $target, $croped, 0, 0, 0, 0, $final_w, $final_h, $w, $h );

imagedestroy ( $croped );

//输出(保存)图片

if (! empty ( $save_img ))

{

$org_funcs ['save_func'] ( $target, $save_img );

} else

{

header ( $org_funcs ['header'] );

$org_funcs ['save_func'] ( $target );

}

imagedestroy ( $target );

return array ('flag' => True, 'msg' => '' );

}

/**

*

* 等比例缩放图像

* @param $src_img 原图片

* @param $save_img 需要保存的地方

* @param $option 参数设置 array('width'=>xx,'height'=>xxx)

*

*/

function resize_image($src_img, $save_img = '', $option)

{

$org_ext = $this->is_img ( $src_img );

if (! $org_ext ['flag'])

{

return $org_ext;

}

//如果有保存路径,则确定路径是否正确

if (! empty ( $save_img ))

{

$f = $this->check_dir ( $save_img );

if (! $f ['flag'])

{

return $f;

}

}

//获取出相应的方法

$org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );

//获取原大小

$source = $org_funcs ['create_func'] ( $src_img );

$src_w = imagesx ( $source );

$src_h = imagesy ( $source );

if (($option ['width'] && $src_w > $option ['width']) || ($option ['height'] && $src_h > $option ['height']))

{

if ($option ['width'] && $src_w > $option ['width'])

{

$widthratio = $option ['width'] / $src_w;

$resizewidth_tag = true;

}

if ($option ['height'] && $src_h > $option ['height'])

{

$heightratio = $option ['height'] / $src_h;

$resizeheight_tag = true;

}

if ($resizewidth_tag && $resizeheight_tag)

{

if ($widthratio < $heightratio)

$ratio = $widthratio;

else

$ratio = $heightratio;

}

if ($resizewidth_tag && ! $resizeheight_tag)

$ratio = $widthratio;

if ($resizeheight_tag && ! $resizewidth_tag)

$ratio = $heightratio;

$newwidth = $src_w * $ratio;

$newheight = $src_h * $ratio;

if (function_exists ( "imagecopyresampled" ))

{

$newim = imagecreatetruecolor ( $newwidth, $newheight );

imagecopyresampled ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );

} else

{

$newim = imagecreate ( $newwidth, $newheight );

imagecopyresized ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );

}

}

//输出(保存)图片

if (! empty ( $save_img ))

{

$org_funcs ['save_func'] ( $newim, $save_img );

} else

{

header ( $org_funcs ['header'] );

$org_funcs ['save_func'] ( $newim );

}

imagedestroy ( $newim );

return array ('flag' => True, 'msg' => '' );

}

/**

*

* 生成水印图片

* @param $org_img 原图像

* @param $mark_img 水印标记图像

* @param $save_img 当其目录不存在时,会试着创建目录

* @param array $option 为水印的一些基本设置包含:

* x:水印的水平位置,默认为减去水印图宽度后的值

* y:水印的垂直位置,默认为减去水印图高度后的值

* alpha:alpha值(控制透明度),默认为50

*/

public function water_mark($org_img, $mark_img, $save_img = '', $option = array())

{

//检查图片

$org_ext = $this->is_img ( $org_img );

if (! $org_ext ['flag'])

{

return $org_ext;

}

$mark_ext = $this->is_img ( $mark_img );

if (! $mark_ext ['flag'])

{

return $mark_ext;

}

//如果有保存路径,则确定路径是否正确

if (! empty ( $save_img ))

{

$f = $this->check_dir ( $save_img );

if (! $f ['flag'])

{

return $f;

}

}

//获取相应画布

$org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );

$org_img_im = $org_funcs ['create_func'] ( $org_img );

$mark_funcs = $this->get_img_funcs ( $mark_ext ['msg'] );

$mark_img_im = $mark_funcs ['create_func'] ( $mark_img );

//拷贝水印图片坐标

$mark_img_im_x = 0;

$mark_img_im_y = 0;

//拷贝水印图片高宽

$mark_img_w = imagesx ( $mark_img_im );

$mark_img_h = imagesy ( $mark_img_im );

$org_img_w = imagesx ( $org_img_im );

$org_img_h = imagesx ( $org_img_im );

//合成生成点坐标

$x = $org_img_w - $mark_img_w;

$org_img_im_x = isset ( $option ['x'] ) ? $option ['x'] : $x;

$org_img_im_x = ($org_img_im_x > $org_img_w or $org_img_im_x < 0) ? $x : $org_img_im_x;

$y = $org_img_h - $mark_img_h;

$org_img_im_y = isset ( $option ['y'] ) ? $option ['y'] : $y;

$org_img_im_y = ($org_img_im_y > $org_img_h or $org_img_im_y < 0) ? $y : $org_img_im_y;

//alpha

$alpha = isset ( $option ['alpha'] ) ? $option ['alpha'] : 50;

$alpha = ($alpha > 100 or $alpha < 0) ? 50 : $alpha;

//合并图片

imagecopymerge ( $org_img_im, $mark_img_im, $org_img_im_x, $org_img_im_y, $mark_img_im_x, $mark_img_im_y, $mark_img_w, $mark_img_h, $alpha );

//输出(保存)图片

if (! empty ( $save_img ))

{

$org_funcs ['save_func'] ( $org_img_im, $save_img );

} else

{

header ( $org_funcs ['header'] );

$org_funcs ['save_func'] ( $org_img_im );

}

//销毁画布

imagedestroy ( $org_img_im );

imagedestroy ( $mark_img_im );

return array ('flag' => True, 'msg' => '' );

}

/**

*

* 检查图片

* @param unknown_type $img_path

* @return array('flag'=>true/false,'msg'=>ext/错误信息)

*/

private function is_img($img_path)

{

if (! file_exists ( $img_path ))

{

return array ('flag' => False, 'msg' => "加载图片 $img_path 失败!" );

}

$ext = explode ( '.', $img_path );

$ext = strtolower ( end ( $ext ) );

if (! in_array ( $ext, $this->exts ))

{

return array ('flag' => False, 'msg' => "图片 $img_path 格式不正确!" );

}

return array ('flag' => True, 'msg' => $ext );

}

/**

*

* 返回正确的图片函数

* @param unknown_type $ext

*/

private function get_img_funcs($ext)

{

//选择

switch ($ext)

{

case 'jpg' :

$header = 'Content-Type:image/jpeg';

$createfunc = 'imagecreatefromjpeg';

$savefunc = 'imagejpeg';

break;

case 'jpeg' :

$header = 'Content-Type:image/jpeg';

$createfunc = 'imagecreatefromjpeg';

$savefunc = 'imagejpeg';

break;

case 'gif' :

$header = 'Content-Type:image/gif';

$createfunc = 'imagecreatefromgif';

$savefunc = 'imagegif';

break;

case 'bmp' :

$header = 'Content-Type:image/bmp';

$createfunc = 'imagecreatefrombmp';

$savefunc = 'imagebmp';

break;

default :

$header = 'Content-Type:image/png';

$createfunc = 'imagecreatefrompng';

$savefunc = 'imagepng';

}

return array ('save_func' => $savefunc, 'create_func' => $createfunc, 'header' => $header );

}

/**

*

* 检查并试着创建目录

* @param $save_img

*/

private function check_dir($save_img)

{

$dir = dirname ( $save_img );

if (! is_dir ( $dir ))

{

if (! mkdir ( $dir, 0777, true ))

{

return array ('flag' => False, 'msg' => "图片保存目录 $dir 无法创建!" );

}

}

return array ('flag' => True, 'msg' => '' );

}

}

if (! empty ( $_FILES ['test'] ['tmp_name'] ))

{

//例子

$img = new Img ();

//原图

$name = explode ( '.', $_FILES ['test'] ['name'] );

$org_img = 'D:/test.' . end ( $name );

move_uploaded_file ( $_FILES ['test'] ['tmp_name'], $org_img );

$option = array ('width' => $_POST ['width'], 'height' => $_POST ['height'] );

if ($_POST ['type'] == 1)

{

$s = $img->resize_image ( $org_img, '', $option );

} else

{

$img->thumb_img ( $org_img, '', $option );

}

unlink ( $org_img );

}

以上所述就是本文的全部内容了,希望大家能够喜欢。

 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表