常用的php圖片處理類(水印、等比縮放、固定高寬)分享
更新時(shí)間:2015年06月19日 10:56:00 投稿:hebedich
這篇文章主要匯總介紹了兩個(gè)常用的php圖片處理類(水印、等比縮放、固定高寬),非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下
常用的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可識(shí)別的編碼 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); } //創(chuàng)建縮略圖 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); //固定長(zhǎng)度圖片 $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庫(kù)失??!' ); } } /** * * 裁剪壓縮 * @param $src_img 圖片 * @param $save_img 生成后的圖片 * @param $option 參數(shù)選項(xiàng),包括: $maxwidth 寬 $maxheight 高 * array('width'=>xx,'height'=>xxx) * @internal * 我們一般的壓縮圖片方法,在圖片過長(zhǎng)或過寬時(shí)生成的圖片 * 都會(huì)被“壓扁”,針對(duì)這個(gè)應(yīng)采用先裁剪后按比例壓縮的方法 */ public function thumb_img($src_img, $save_img = '', $option) { if (empty ( $option ['width'] ) or empty ( $option ['height'] )) { return array ('flag' => False, 'msg' => '原圖長(zhǎng)度與寬度不能小于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; } } //獲取出相應(yīng)的方法 $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] ); //獲取原大小 $source = $org_funcs ['create_func'] ( $src_img ); $src_w = imagesx ( $source ); $src_h = imagesy ( $source ); //調(diào)整原始圖像(保持圖片原形狀裁剪圖像) $dst_scale = $option ['height'] / $option ['width']; //目標(biāo)圖像長(zhǎng)寬比 $src_scale = $src_h / $src_w; // 原圖長(zhǎng)寬比 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 參數(shù)設(shè)置 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; } } //獲取出相應(yīng)的方法 $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 水印標(biāo)記圖像 * @param $save_img 當(dāng)其目錄不存在時(shí),會(huì)試著創(chuàng)建目錄 * @param array $option 為水印的一些基本設(shè)置包含: * x:水印的水平位置,默認(rèn)為減去水印圖寬度后的值 * y:水印的垂直位置,默認(rèn)為減去水印圖高度后的值 * alpha:alpha值(控制透明度),默認(rèn)為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; } } //獲取相應(yīng)畫布 $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 ); //拷貝水印圖片坐標(biāo) $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 ); //合成生成點(diǎn)坐標(biāo) $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/錯(cuò)誤信息) */ 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 ); } /** * * 返回正確的圖片函數(shù) * @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 ); } /** * * 檢查并試著創(chuàng)建目錄 * @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 無法創(chuàng)建!" ); } } 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 ); }
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
thinkphp中字符截取函數(shù)msubstr()用法分析
這篇文章主要介紹了thinkphp中字符截取函數(shù)msubstr()用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了thinkPHP中字符截取函數(shù)msubstr()的功能、定義使用技巧與注意事項(xiàng),需要的朋友可以參考下2016-01-01關(guān)于 Laravel Redis 多個(gè)進(jìn)程同時(shí)取隊(duì)列問題詳解
這篇文章主要給大家介紹了關(guān)于 Laravel Redis 多個(gè)進(jìn)程同時(shí)取隊(duì)列問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12php compact 通過變量創(chuàng)建數(shù)組
php compact函數(shù)用于創(chuàng)建數(shù)組,該函數(shù)創(chuàng)建數(shù)組比較特殊,compact函數(shù)參數(shù)將接受一個(gè)或多個(gè)變量,然后將變量的名稱作為該創(chuàng)建數(shù)組的索引,變量值作為該創(chuàng)建數(shù)組的值,然后返回創(chuàng)建完成的數(shù)組。本文章向大家講解compact函數(shù)的基本語(yǔ)法及使用實(shí)例。需要的碼農(nóng)可以參考一下。2016-11-11- 本文章來給各位同學(xué)介紹一下關(guān)于Php CURL模擬登陸論壇并采集數(shù)據(jù)實(shí)例,如果你對(duì)利用curl模擬登錄功能有興趣可進(jìn)入?yún)⒖肌?/div> 2015-05-05
PHP如何通過AJAX方式實(shí)現(xiàn)登錄功能
PHP是一門很好的語(yǔ)言,可以很方便的開發(fā)web應(yīng)用程序,下面介紹一下Ajax+PHP+MySQL登陸示例,感興趣的小伙伴們可以參考一下2015-11-11最新評(píng)論