-
-
/**
- *
- * 影像處理類別
- * @author FC_LAMP
- * @internal功能包含:水印,縮圖
- */
- class Img
- {
- //圖片格式
- private $exts = array ('jpg', 'jpeg', 'gif', 'bmp', 'png' );
/**
- *
- *
- * @拋出異常
- */
- 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'] ) 或 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 );
- }
- getagedestro );
- 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;
- }
- }
- 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_ww;
- $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 $ratio = $widthratio; else $ratio = $heightratio; }
if ($resizewidth_tag && ! $resizeheight_tag)
- $ratio = $widthratio;
- if ($resizeheight_tag && ! $resizewidth_tag)
; $newwidth = $src_w * $ratio;
- $newheight = $src_h * $ratio;
if (function_exists ( "imagecopyresampled" ))
- {
- $new🎜> $newim = imagecreatetruecolor ( $newwidth, $newheight );
- imagecopyresampled ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
-
- $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 );
- 如果(! $mark_ext ['flag'])
- {
- return $mark_ext;
- }
- // 如果有路徑保存,則確定路徑是否正確
- if (!empty ( $save_img ))
- {
- $f = $this->check_dir ( $save_img );
- if (! $f ['flag'])
- {
- 回傳$f;
- }
- }
//取得回覆部分
- $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
- $org_img_im = $org_funcs ['create_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 ges; ;
// 合成生成點座標
- $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 或 $org_img_im_x $org_img_im_y = isset ($option ['y']) ? $option ['y'] : $y;
- $org_img_im_y = ($org_img_im_y > $org_img_h 或 $org_img_im_y
// 🎜> $alpha = isset ( $option ['alpha'] ) ? $option ['alpha'] : 50;
- $alpha = ($alpha > 100 或 $alpha
//合併圖片
- imagecopymerge ( $org_img_im, $mark_img_im, $org_img_im_x, $org_img_im_y, $mark_img_im_x, $marks_x, $org_img_im_y, $mark_img_im_x, $markm_x, $wm, $ );
// 輸出(儲存)圖片
- if (!empty ( $save_img ))
- {
$org_funcs ['save_func '] ( $org_img_im, $save_img );
- } else
- {
- header ( $org_funcs ['header'] );
- $org_funcs ['save_func'] ( $org_img_); > }
- // 輔導睡眠
- 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/錯誤訊息)
- */
- 私有函數is_img($img_path)
- {
- if (! file_exists (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 (this->exts )) { return array (this->exts )) { return。 'flag' => False, 'msg' => "圖片$img_path不對格式!" );
- }
- 回傳數組('flag' => True, 'msg' => $ext );
- }
/**
- *
- * 傳回正確的圖片函數
- * @param unknown_type $ext
- * /
- private function get_img_funcs($ext)
- {
- //選擇
- switch ($ext)
- {
- case 'jpg' :
- $ Type:image/jpeg';
- $createfunc = 'imagecreatefromjpeg';
- $savefunc = 'imagejpeg';
- 中斷;
- case 'jpeg' :
- $0header = 'Content-Typeheader = 'Content-Typeheader = 'Content-Typeheader = 'Content-Typeheader = 'Content-Typeheader = 'Content-Type :image/jpeg';
- $createfunc = 'imagecreatefromjpeg';
- $savefunc = 'imagejpeg';
- break;
- case 'gif' :
- $header = '內容類型:imheader = '內容類型:gif /gif';
- $createfunc = 'imagecreatefromgif';
- $savefunc = 'imagegif';
- 中斷;
- case 'bmp' :
- $header = '內容-Type:image/ bmp';
- $createfunc = 'imagecreatefrombmp';
- $savefunc = 'imagebmp';
- 中斷;
- 預設:
- $header = 'Content-Type:image /png';
- $createfunc = 'imagecreatefrompng';
- $savefunc = 'imagepng';
- }
- 傳回陣列('save_func' => $savefunc, 'create_func' => $ createf, 'header'unc' => $ createf, ' $header );
- }
/**
- *
- * 檢查並試著建立目錄
- * @param $save_img
- */
- 私有函數check_dir($save_img)
- {
- $dir = 目錄名( $ save_img );
- if (! is_dir ( $dir ))
- {
- if (! mkdir ( $dir, 0777, true ))
- {
- return array ('flag' = False, 'msg' => "圖片儲存目錄$dir 無法建立! " );
- }
- }
- 回傳數組('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 );
- }
- 取消連結( $org_img );
- }
複製程式碼
使用方式:
php浮水印
-
- $img = new Img ();
- $org_img = 'D:/tt.png';
- $mark_img = 'D: /t.png';
- //儲存浮水印圖片(如果$save_img為空時,將直接輸出圖片)
- $save_img = 'D:/test99h/testone/sss.png';
- / /水印設定調整
- $option = array('x' => 50, 'y' => 50, 'alpha' => 80 );
- //產生浮水印圖片
- $ flag = $img ->water_mark ( $org_img, $mark_img, $save_img, $option );
複製代碼
當調節$option參數時,會有對應的變化:
-
-
//範例
- $img = new Img ();
- $org_img = 'D:/tt . png';
- //壓縮圖片(100*100)
- $option = array('width' => 100, 'height' => 100 );
- / /$save_img為空時,將直接輸出影像到瀏覽器
$save_img = 'D:/test99h/testone/sss_thumb.png';
- $flag = $img-> thumb_img ( $org_img, $save_img, $option );
-
-
複製程式碼
調節🎜>複製程式碼
調整$option的大小值:
-
-
-
-
- $img = new Img ();
- //原圖
- $org_img = 'D:/tt.png';
- //水印標記圖
- $mark_img = 'D:/t.png';
- //儲存浮水印圖片
- $save_img = 'D:/test99h/testone/sss.png';
- //浮水印設定調整
- $option = array('x' => 50, 'y' => 50, 'alpha' => 60 );
- //產生浮水印圖片
- $flag = $img->water_mark ( $org_img, $mark_img, $save_img, $option );
- //壓縮水印圖片
- $option = array('width' => 200, 'height' => 200 );
- //儲存壓縮圖
$save_img2 = 'D:/test99h/testone/sss2_thumb.png'; $flag = $img->thumb_img ( $save_img, $ save_img2, $選項;); /等比例壓縮類似
複製程式碼
|
在壓縮產生的水印影像時,壓縮後產生的影像格式應與原始影像,浮水印影像一致。
否則,會出現一些未知的錯誤。