1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |
<?php /** * Created by PhpStorm. * User: MCtion * Date: 2015/5/14 0014 * Time: 15:36 * 簡單的映像類庫,本類中所有相對路徑均基於網站根目錄,如需修改,則修改常量__WEBROOT__即可 * 功能:指定文字內容建立圖片(不支援中文)、建立驗證碼圖片、建立縮圖、其他功能待續 * 方法: * Style(array $Options) 設定圖片樣式,每次設定前將重設為預設樣式 * Create_Img_Png() 建立PNG映像,相關屬性由Style指定 * Create_Img_Jpeg() 建立JPEG映像,相關屬性由Style指定 * Create_Verify() 建立驗證碼映像,相關屬性由Style指定 * Get_Verify() 獲得建立的驗證碼值,MD5加密 * Load_Img(string $FilePath) 載入映像,建立映像源,供其他方法調用源,FilePath為映像相對路徑 * Create_Thumb(string $FileName,string $FilePath) 建立由Load_Img()載入的映像的縮圖,FileName為儲存後的映像首碼,FilePath為儲存映像的相對路徑,不包含檔案名稱(例:/Uploads/images/Thumb/) */ if(!defined("__WEBROOT__")) define("__WEBROOT__",$_SERVER['DOCUMENT_ROOT']); class Img { protected $_Img; //圖片源 protected $_FileImg; //載入的圖片源 protected $_FileInfo; //載入的圖片的資訊數組 protected $_PicInfo; //載入的圖片的寬高等資訊數組 protected $_Rand = 'abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ1234567890'; //隨機因子 protected $_Code = ''; //驗證碼 public $Width = 300;//圖片預設寬 public $Height = 80; //圖片預設高 public $BackgroundColor = "000000"; public $Font = "/phps/Public/Font/ARIALNB.TTF"; //預設字型 public $FontSize = 16; //預設字型字型大小 public $FontColor = "ffffff"; //預設字型顏色 public $Content = "Test Word"; public $Align = "left"; public $Codes = 4; //驗證碼個數 public $Line = 6; //幹擾線條的個數 public $LoadErr = ''; //錯誤資訊 //public function __construct(){} /** 設定圖片屬性 * @param array $Options 屬性數組 * @return $this 返回對象 */ public function Style($Options){ $this -> _Re_Set(); foreach($Options as $K=>$V){ if(in_array($K,array('Width','Height','BackgroundColor','Font','FontSize','FontColor','Content','Align','Codes','Line','Snow'))){ if($K == "BackgroundColor" || $K == "FontColor"){ if(preg_match("#([a-zA-Z0-9]{6})#",$V)) $this -> $K = $V; }else{ $this -> $K = $V; } } } return $this; } /** * 重設屬性,不提供外部存取 */ protected function _Re_Set(){ $this -> Width = 100; $this -> Height = 30; $this -> BackgroundColor = "000000"; $this -> Font = "/phps/Public/Font/ARIALNB.TTF"; $this -> FontSize = 16; $this -> FontColor = "ffffff"; $this -> Align = "left"; $this -> Codes =4; $this -> Line = 6; } /** * 建立映像源、添加背景、建立映像 * @param bool $BGC 指定是否建立背景色及矩形塊 */ protected function _Create_Img_GB($BGC = True){ $this -> _Img = imagecreatetruecolor($this -> Width,$this -> Height); //建立背景源 if($BGC){ preg_match("#([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})#",$this -> BackgroundColor,$ColorArr); //將顏色值分隔成三組16位進位數 $Color = imagecolorallocate($this -> _Img,hexdec($ColorArr[1]),hexdec($ColorArr[2]),hexdec($ColorArr[3])); //給Img映像源添加背景色 imagefilledrectangle($this -> _Img,0,$this -> Height,$this -> Width,0,$Color); //建立映像 } } /** * 建立隨機驗證碼 */ protected function _Create_Code(){ $Len = strlen($this -> _Rand) - 1; for($i = 0;$i < $this -> Codes;$i++){ $this -> _Code .= $this -> _Rand[mt_rand(0,$Len)]; } } /** * 向映像中寫入字串,暫不支援中文 */ protected function _Write_Text(){ $FontWidth = imagefontwidth($this -> FontSize); //擷取字型大小的一個字元的寬度 preg_match_all('/(.)/us', $this -> Content, $TextArr); //將內容分隔成數組一遍統計個數 $FontHeight = imagefontheight($this -> FontSize); //擷取字型大小的高度 $X = ceil(($this -> Width - ($FontWidth * count($TextArr[0]))) / 2); //設定X軸距左邊距的距離 $Y = ceil(($this -> Height + $FontHeight) / 2); //設定Y軸距上邊距的距離 preg_match("#([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})#",$this -> FontColor,$ColorArr); $Color = imagecolorallocate($this -> _Img,hexdec($ColorArr[1]),hexdec($ColorArr[2]),hexdec($ColorArr[3])); //設定文字顏色 imagettftext($this -> _Img,$this -> FontSize,0,$X,$Y,$Color,__WEBROOT__.$this -> Font,$this -> Content); //寫入內容 } /** * 向映像中寫入驗證碼 */ protected function _Write_Code(){ $_X = $this -> Width / $this -> Codes; //設定寬高比 for($i = 0;$i < $this -> Codes;$i++){ //迴圈Codes次,每次產生一位驗證碼值 $Color = imagecolorallocate($this -> _Img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156)); //隨機產生驗證碼值的顏色 imagettftext($this -> _Img,$this -> FontSize,mt_rand(-30,30),$_X*$i+mt_rand(1,5),$this -> Height / 1.3,$Color,__WEBROOT__.$this -> Font,$this -> _Code[$i]); //產生一位驗證碼值 } } /** * 向映像中寫入幹擾線條 */ protected function _Write_Line() { //產生幹擾線條 for ($i=0;$i < $this -> Line;$i++) { $Color = imagecolorallocate($this -> _Img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156)); imageline($this -> _Img,mt_rand(0,$this -> Width),mt_rand(0,$this -> Height),mt_rand(0,$this -> Width),mt_rand(0,$this -> Height),$Color); } } /** * 設定映像類型為JPEG */ protected function _Img_Jpeg(){ header('Content-type:image/jpeg'); imagejpeg($this -> _Img); imagedestroy($this -> _Img); } /** * 設定映像類型為PNG */ protected function _Img_Png(){ header('Content-type:image/png'); imagepng($this -> _Img); imagedestroy($this -> _Img); } /** * 建立JPEG的字串映像 */ public function Create_Img_Jpg(){ $this -> _Create_Img_GB(True); $this -> _Write_Text(); $this -> _Img_Jpeg(); } /** * 建立PNG的字串映像 */ public function Create_Img_Png(){ $this -> _Create_Img_GB(True); $this -> _Write_Text(); $this -> _Img_Png(); } /** * 建立驗證碼的PNG映像 */ public function Create_Verify(){ $this -> BackgroundColor = ''; for($I = 0;$I < 3;$I++){ $this -> BackgroundColor .= dechex(mt_rand(20,155)); } $this -> _Create_Img_GB(True); $this -> _Create_Code(); $this -> _Write_Line(); $this -> _Write_Code(); $this -> _Img_Png(); } /** * 外部擷取MD5加密後的驗證碼 * @return string */ public function Get_Verify(){ return md5($this -> _Code); } /** * 載入一個影像檔,並擷取映像相關資訊 * @param string $FilePath 映像相對路徑地址 * @return $this|bool 成功返回對象,否則返回FALSE */ public function Load_Img($FilePath){ $FilePath = __WEBROOT__.$FilePath; if(!is_file($FilePath)){ $this -> LoadErr = "路徑錯誤,檔案不存在"; Return False; } $this -> _PicInfo = getimagesize($FilePath); $this -> _FileInfo = pathinfo($FilePath); switch($this -> _PicInfo[2]){ case 1:$this ->_FileImg = imagecreatefromgif($FilePath);break; case 2:$this ->_FileImg = imagecreatefromjpeg($FilePath);break; case 3:$this ->_FileImg = imagecreatefrompng($FilePath);break; default:$this -> LoadErr = "類型錯誤,不支援的圖片類型";Return False; } Return True; } /** * 建立縮圖 * @param string $FileName 儲存的圖片名稱首碼 * @param string $FilePath 儲存圖片的相對路徑 * @return mixed 返回產生的圖片的資訊數組 */ public function Create_Thumb($FileName,$FilePath){ $SavePath = __WEBROOT__.$FilePath; if(!file_exists($SavePath)){ mkdir($SavePath,0777,true); } $FileName = $FileName.date("YmdHis").rand(100,999).'.'.$this -> _FileInfo['extension']; $FilePath = $FilePath.$FileName; $SavePath = $SavePath.$FileName; $this -> _Create_Img_GB(False); imagecopyresampled($this -> _Img,$this -> _FileImg,0,0,0,0,$this -> Width,$this -> Height,$this -> _PicInfo[0],$this -> _PicInfo[1]); switch($this -> _PicInfo[2]){ case 1:imagegif($this -> _Img,$SavePath);break; case 2:imagejpeg($this -> _Img,$SavePath);break; case 3:imagepng($this -> _Img,$SavePath);break; } $FIleInfo['FileName'] = $FileName; $FIleInfo['FilePath'] = $FilePath; Return $FIleInfo; } } |