PHP之MVC项目实战(二)
本文主要包括以下內容
GD庫圖片操作
<?php$img = imagecreatetruecolor(500, 300); //var_dumP($img); // //分配綠色 $green = imagecolorallocate($img, 0, 0xff, 0x0); //var_dump($green);//fill $result = imagefill($img, 0, 0, $green); //var_dump($result);//導出 imagepng($img, './green.png');// imagedestroy($img);創建畫布
imagecreatefromXXXX XXX表示格式:
//打開,利用已有的圖片創建畫布資源!
imagecreatefromjpeg
imagecreatefrompng,從png格式創建畫布
imagecreatefromgif
操作畫布
利用一個個的工具函數,完成畫布的處理的!
選擇顏色,分配顏色
如果需要使用某個顏色,在畫布上操作,一定要先將顏色分配到畫布上!
利用函數:
imagecolorallocate(畫布,顏色).向畫布上分配顏色
顏色是RGB,紅綠藍,顏色需要三個參數,分別表示R,G,B的值
顏色標識= imagecolorallocate(畫布,R,G,B)
每個顏色值,是一個整型!
0-255十進制
0x0 - 0xff 十六進制
填充畫布
利用函數:imagefill完成填充
imagefill(畫布,填充位置X, 填充位置Y,顏色);
將像素周圍的連續的并且顏色相同的區域可以完成填充!
填充位置使用填充點的坐標表示:
圖片位置的原點為 左上角!坐標為(0,0) 因此右下角的坐標是?(width-1,height-1 499,299)
將畫布導出成圖片
imageXXXX,XXX表示格式
imagejpeg
imagegif 導出成gif格式
imagepng
一個畫布可以導出多次,而且是任意格式!
imagepng(畫布,保存文件);
銷毀資源
imagedestroy();
利用GD庫實現驗證碼
<?php //require '111.php';$rand_bg_file = './captcha/captcha_bg' . mt_rand(1, 5) . '.jpg'; //echo $rand_bg_file; //創建畫布 $img = imagecreatefromjpeg($rand_bg_file);//繪制邊框 $white = imagecolorallocate($img, 0xff, 0xff, 0xff); //不填充矩形 imagerectangle($img, 0, 0, 144, 19, $white);//寫碼值 //生成碼值,隨機的4個只包含大寫字母,和數字的字符串! $chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';//32 個字符 //隨機取4個 $captcha_str = ''; for($i=1,$strlen=strlen($chars); $i<=4; ++$i) {$rand_key = mt_rand(0, $strlen-1);$captcha_str .= $chars[$rand_key]; } //保存到session中 @session_start(); $_SESSION['captcha_code'] = $captcha_str; //echo $captcha_str; //寫//先確定顏色,白黑隨機! $black = imagecolorallocate($img, 0, 0, 0); if(mt_rand(0, 1) == 1 ) {$str_color = $white; } else {$str_color = $black; }imagestring($img, 5, 60, 3, $captcha_str, $str_color);//保存 //imagejpeg($img, './captcha.jpg');//輸出到文件內! //告知瀏覽器,發送的是jpeg格式的圖片 header('Content-Type: image/jpeg; charset=utf-8');//echo 'itcast'; imagejpeg($img);//輸出到瀏覽器端!//銷毀資源 imagedestroy($img);繪制邊框
畫一個不填充的矩形!
利用函數
imagerectangle()完成
imagerectangle(畫布,左上角X,左上角Y,右下角X,右下角Y,筆觸顏色);
利用左上角,與右下角的坐標確定矩形范圍!
寫驗證碼
寫到 畫布上
利用函數
imagestring()
imagestring(畫布,字體大小,位置X,Y,字符串,顏色);
其中imagestring典型的是使用內置字體!(不支持中文)。字體大小1-5.5最大!
導出,保存
imagejpeg();
將驗證碼展示到頁面上
典型的:
使用一個php文件,直接輸一個圖片內容!
直接輸出的請求的瀏覽器端
imagejpeg(畫布,保存文件)
如果沒有第二個參數,則是直接輸出!
此時應該在輸出圖片內容到瀏覽器之前,告知瀏覽器,當前內容是二進制的圖片內容!
header();//
header(‘Content-Type: text/html; charset=utf-8’);//告知瀏覽器發送的內容以utf8編碼形式的文件html數據!
此時,使用 img標簽的src屬性,請求一個生成圖片的php程序即可顯示圖片!
如果向瀏覽器發送的是圖片,則如果有錯誤瀏覽器不會顯示,會將報錯信息當作圖片內容看待,所以此時如果要調錯,則此時
要把header(‘Content-Type:image/jpeg’)先注釋!需要嚴格輸出的時候,PHP的開頭
文件上傳
數據在存儲或者傳輸時,存在兩種編碼:字節碼,二進制碼!
普通的字符串上傳到服務器需要字節編碼!
但是將文件上傳的編碼是: 二進制編碼!
但是,默認的,瀏覽器是不會處理二進制編碼的!將所有的數據都當字節碼字符串處理!
因此上傳文件的第一個工作:
告知瀏覽器,當前表單內,有需要被二進制編碼的數據!(編碼的數據是由多種編碼組成)
利用表單的屬性:
enctype=”multipart/form-data”
此時瀏覽器在碰到文件域時,就知道以二進制形式編碼!
此時,提交到服務器上表單內的所有數據(字符串,文件)
服務器的PHP代碼來處理數據:
對字符串的處理:保存$_POST變量內(內存中)
對文件的處理:將接收到文件,保存到服務器系統的臨時目錄下。有效期,當前腳本結束!
用戶需要在php的腳本執行周期內,將臨時文件 持久化(拷貝到別的地方)
利用函數:
move_uploaded_file();//移動已經上傳的文件
移動結果 = move_uploaded_file(臨時文件,目標文件)
上傳的臨時文件的信息,被保存到超全局數組變量$_FILES中!
為每個上傳的文件,整理5個信息:
- name: 原始文件名
- type: 類型。image/jpeg text/html 網絡上標識資源類型方法。稱之為MIME(多用途internel郵件擴展類型)類型。
- tmp_name:臨時文件名
- error:錯誤標號(0,123467)
- size:大小,字節Byte
代碼解釋
唯一字符串 = uniqid(前綴)函數可以得到一個唯一的字符串!并且可以指定前綴:
strrchr()。找到某個子字符串的最后出現位置,從該位置開始,截取到字符串的最后!
錯誤類型
文件太大,超過了php的對上傳文件的最大限制
可以php的配置文件中修改:
PHP對所有post數據的大小也有限制:所有的表單數據加起來,不能超過!文件過大,超出了表單內的一個隱藏元素的限制:
該元素要出現在文件上傳域之前
上傳文件工具類
<?phpclass UploadTool {private $upload_dir;//上傳目錄private $max_size;private $allow_types;private $error_info;public function __construct($dir='', $size=2000000, $types=array()) {$this->upload_dir = $dir;$this->max_size = $size;$this->allow_types = empty($types)?array('image/jpeg', 'image/png'):$types;}public function __set($p_name, $p_value) {if (in_array($p_name, array('upload_dir', 'max_size', 'allow_types'))) {$this->$p_name = $p_value;}}public function __get($p_name) {if ($p_name == 'error_info') {return $this->$p_name;}}/*** 拿到一個上傳文件的信息* 判斷其合理和合法性,移動到指定目標** @param $file array 包含了5個上傳文件信息的數組* @param $prefix string 生成文件的前綴** @return 成功,目標文件名;失敗:false*/function upload($file, $prefix='upload_') {//判斷是否有錯誤if($file['error'] != 0 ) {//文件上傳錯誤switch ($file['error']) {case 1:$this->error_info = '文件太大,超出了php.ini的限制';break;case 2:$this->error_info = '文件太大,超出了表單內的MAX_FILE_SIZE的限制';break;case 3:$this->error_info = '文件沒有上傳完';break;case 4:$this->error_info = '沒有上傳文件';break;case 6:case 7:$this->error_info = '臨時文件夾錯誤';break;}return false;}//判斷類型if(!in_array($file['type'], $this->allow_types)) {$this->error_info = '類型不對';return false;}//判斷大小if($file['size'] > $this->max_size) {$this->error_info = '文件過大';return false;}//處于安全性的考慮,判斷是否是一個真正的上傳文件:if( !is_uploaded_file($file['tmp_name'])) {$this->error_info = '上傳文件可疑';return false;}//移動//通常都會為目標文件重啟名字//原則是:不重名,沒有特殊字符,有一定的意義!$dst_file = uniqid($prefix) . strrchr($file['name'], '.');if (move_uploaded_file($file['tmp_name'], $this->upload_dir . $dst_file)) {//移動成功,上傳完畢!return $dst_file;} else {//失敗$this->error_info = '移動失敗';return false;}}}分子目錄保存
目錄的創建,mkdir()!
mkdir(目錄位置,是否遞歸創建);
假設b不存在,則:
mkdir(‘a/b/c’);失敗
mkdir(‘a/b/c’, true);成功
判斷目錄是否已經存在,is_dir()判斷是否是一個目錄!
bool = is_dir(目錄地址)
劃分子目錄的原則!
典型的原則,依據上傳時間完成子目錄的創建!
按照小時創建子目錄!
利用函數 date()可以格式化時間。將一個時間戳,以易于理解的形式展示!
date(‘格式’, 時間戳=time())
tip:strtotime()將一個日期格式變成時間戳!
//形成子目錄$sub_dir = date('YmdH');//判斷是否存在if(! is_dir($this->upload_dir . $sub_dir)) {//不存在則創建mkdir ($this->upload_dir . $sub_dir);}注意:這里會報date(): It is not safe to rely on the system’s timezone settings.
解決方法:解決方法
縮略圖
基本過程
采樣:在原圖上采樣(采集需要被復制的圖像區域)
拷貝:將采集的圖樣信息,拷貝到某個畫布上(縮略圖)
修改:修改大小,修改拷貝之后的大小區域結果
需要一個php的gd函數:
imagecopyresampled();采樣拷貝,并修改大小
需要的參數有哪些?
兩個畫布:原圖畫布,與縮略圖畫布,dstimg,src_img
采集區域控制:在原圖上的一個矩形區域!左上角坐標,寬,高!
拷貝到縮略圖畫布上的位置與大小:在縮略圖畫布上矩形!坐標和寬高!
目標在前,而原圖在后!先畫布,左上角坐標,寬高!
imagecopyresampled(dstimg,src_img, dstx,dst_y, srcx,src_y, dstw,dst_h, srcw,src_h);
實現步驟
1創建原圖畫布和縮略圖畫布
2采樣,拷貝,修改大小
imagecopryresampled();
3導出
4銷毀
等比例的縮略圖
實現方式:
一種:限定縮略圖的最大尺寸!
二種:補白生成大小一致的縮略圖!
圖片工具類
<?phpclass ImageTool {/*** 生成縮略圖,補白** @param $src_file* @param $max_w;* @param $max_h;* * @return 縮略圖的圖片地址。失敗false!*/public function makeThumb($src_file, $max_w, $max_h) {//判斷原圖片是否存在if (! file_exists($src_file)) {$this->error_info = '源文件不存在';return false;}//計算原圖的寬高$src_info = getimagesize($src_file);$src_w = $src_info[0];//原圖寬$src_h = $src_info[1];//原圖高//在增加一個判斷!//如果原圖尺寸小于范圍(縮略圖尺寸)if($src_w < $max_w && $src_h < $max_h) {//則不用判斷,直接用原圖的$dst_w = $src_w;$dst_h = $src_h;} else {//比較 寬之比 與 高之比if($src_w/$max_w > $src_h/$max_h) {//寬應該縮放的多$dst_w = $max_w;//縮略圖的寬為范圍的寬$dst_h = $src_h/$src_w * $dst_w;//按照原圖的寬高比將求出縮略圖高} else {$dst_h = $max_h;$dst_w = $src_w/$src_h * $dst_h;}}//創建畫布$src_img = imagecreatefromjpeg($src_file);//基于已有圖片創建//縮略圖的大小一致!$dst_img = imagecreatetruecolor($max_w, $max_h);//創建一個新的畫布//為縮略圖確定顏色,藍色$blue = imagecolorallocate($dst_img, 0x0, 0x0, 0xff);imagefill($dst_img, 0, 0, $blue);//填充//采樣,拷貝,修改大小。注意放置的位置!$dst_x=($max_w-$dst_w)/2;$dst_y=($max_h-$dst_h)/2;imagecopyresampled($dst_img, $src_img, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);//導出//取得原始文件的路徑與名字$src_dir = dirname($src_file);$src_basename = basename($src_file);$thumb_file=substr($src_basename, 0, strrpos($src_basename, '.')) . '_thumb' . strrchr($src_basename, '.');imagejpeg($dst_img, $src_dir . DS . $thumb_file);//銷毀imagedestroy($dst_img);imagedestroy($src_img);//返回return basename($src_dir) . '/' . $thumb_file;} }水印
將一張圖片 合并 到另一張圖片上!
采樣:從印章圖片上采集作為水印的圖片!
拷貝:將采集到的顏色信息,拷貝到需要增加水印的圖片上!
合并:需要確定合并位置(不能確定合并的大小),同時需要確定透明度!
一個函數:
imagecopymerge()
需要的參數:
兩個畫布:印章,待增加水印的畫布
采集的區域:坐標和寬高
合并的位置:坐標
合并的透明度:透明值
共 9 個參數!
畫布,坐標,寬高,透明度;目標在前!
imagecopymerge(dstimg,stamp_img, dstx,dst_y, stampx,stamp_y, stampw,stamp_h, $pct )
總結
以上是生活随笔為你收集整理的PHP之MVC项目实战(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吴恩达作业10:用卷积神经网络识别人脸h
- 下一篇: PHP之MVC学习