国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

GD庫使用小結---1

2019-11-15 02:10:38
字體:
來源:轉載
供稿:網友
GD庫使用小結---1

  因為一開始,“大家”都說一般任務中,用php操作圖片不常見,像我們這種基本業務型的,就更用不到了,所以先別看,偶就沒有看。現在有機會了自然要來玩一把。

  以前學過C#的GDI+,交了課程設計后忘得一干二凈。又被迫學了點MFC的畫圖,覺得這是最蛋疼的畫圖過程。去年做了個小任務時用到了js圖表控件,用的是封裝好的js庫直接調方法,然后發現這是用HTML5的canvas元素結合js打造而成,這些chart控件很多很漂亮:jsChart、HighChart、EChart、aChart、Chart.js等等,都是基于canvas,還有svg這貨也很強大。

  對比下有不少共同點,首先都要創建一個環境(context),就像真實的人畫畫一樣,得給他一個完整的環境:一間畫室,一張畫板,若干畫筆、顏料等,這樣的硬性條件具備后才能開始作圖,這個環境聽起來很抽象,簡單理解就是機子上必須具備某些“庫”、“擴展”,類似于.net framework、jave runtime等,畫js圖表你得下載和加載對應的js文件,你的瀏覽器得支持canvas,這些硬性條件構成了這個(底層)環境,某些任務需要這些底層去完成,就像玩游戲,很多大點的游戲必須要directX,也是這個道理。

  然后就是調用這個環境提供的各種庫的方法,來畫各種圖形:點、線、圓(弧)、橢圓、矩形、多邊形、字符、文本等,再強大的可能直接提供了一些經典的曲線如貝塞爾等,然后可以設置這些圖形的樣式,線條連續還是斷續,顏色紅還是綠,畫圖形時是畫個空框架還是將內部填充,畫在界面上哪里(圖在屏幕上坐標多少),正著放還是歇著放(角度多少),圖形長寬如何等等,都應有方法可調。

  等一切設置完畢就是畫到界面上了,然后可能會做釋放某些資源的掃尾工作(垃圾回收)。大多數工作都在設置各種參數的階段。

  php使用GD庫進行繪圖,請確保開啟了這個擴展。可以看到當前GD庫的版本,支持的類型GIF、JPEG、PNG、WBMP等,FreeType大致查了下是一個字體引擎,提供訪問各種字體接口,可供我們繪制文字,也算一個庫擴展,只是包含在gd庫中。

      

  php畫圖也基本遵循這個過程:創建畫布(相當于繪圖環境)->設置參數,繪制圖像 -> 輸出(保存)圖像 -> 資源釋放。如果是將圖片直接輸出到瀏覽器,實際是放在一個img標簽中,它的src屬性是這個腳本的所在路徑。一個最簡單的示例

<?php    // 創建畫布    $width = 200;   // 規定畫布的寬高    $height = 100;    $image = imagecreatetruecolor($width, $height);  // 創建一幅真彩色圖像    // 添加一些即將用到的顏色    $white = imagecolorallocate($image, 0xf2, 0xec, 0xe0);    $orange = imagecolorallocate($image, 0xff, 0xa5, 0x4c);    // 對畫布背景填充顏色    imagefill($image, 0, 0, $white);    // 畫一串字符串在畫布上    imagestring($image, 5, 30, 40, "Hello World", $orange);    // 通知瀏覽器輸出的是圖像(png類型)    header('Content-Type: image/png');    // 輸出到瀏覽器    imagepng($image);    // 釋放圖像資源    imagedestroy($image);

  運行結果與審查元素,src是腳本訪問鏈接,圖片實際是放在img標簽中。

        

  1. 創建畫布

  在php中有三種方式,一是imagecreate方法,一是imagecreatetruecolor,這兩者不依賴已有文件,創建一幅畫布,參數需要制定畫布的寬高(如示例),返回一個resource資源型變量,有的稱為句柄,以后的操作都在這個資源型變量上進行,它就代表這這幅圖像,imagesx和imagesy方法可分別獲取到它的寬高屬性。稍不同的是,imagecreate方法會在添加顏色時,將第一種添加的顏色(調用imagecolorallocate方法)作為整個畫布的背景色,而后者則需要調用方法對背景指定一個添加好的顏色進行填充。還有一類方法是基于現有的文件來創建畫布,如imagecreatefromjpeg方法,從一個現有的jpeg(jpg)格式圖片創建畫布,參數需要你傳入該格式文件所在的路徑,所以它的代碼可以簡單到這樣

<?php    $filename = 'H:/wampserver/wamp/www/html/image/2015.png';  // 一個有效的文件路徑    $image = imagecreatefrompng($filename);  // 從現有文件創建圖像    header('Content-Type: image/png');    imagepng($image);                        // 輸出圖像到瀏覽器    imagedestroy($image);                    // 釋放資源

  2. 設置顏色各項參數

  GD庫繪圖時顏色是被分配(allocate)到畫布環境中的,不是你想畫個啥,臨時給個顏色變量就行,調用的是imagecolorallocate方法,原型是

  intimagecolorallocate(resource$image,int$red,int$green,int$blue),第一個參數是前面創建的圖像資源變量,后三個一次是紅綠藍色值,采用RGB三原色佳色法原理,繪制真彩色圖像,每一個范圍是0~255,當RGB=(255, 255, 255),就是白色,很多地方喜歡用十六進制表示,比如CSS中常見#ffffff(大小寫均可),所以R、G、B可分別給值0xff、0xff、0xff,每allocate一次分配一種。看看imagecolorallocate函數原型,你會發現它返回的是int型,所以推測它只是對傳入的rgb值合成一個顏色后返回一個編號,rgb真彩色是65535種顏色,這樣可以每個顏色對應一個數值編號,最好當然還是用變量,憑空寫個顏色數值恐怕很難。

  使用imagecreate創建畫布時,會將第一種分配的顏色作為畫布的背景色(如前),如果是imagecreatetruecolor,則需調用imagefill來填充背景色,方法原型:boolimagefill(resource$image,int$x,int$y,int$color),它會將$x和$y附近的點填充為$color顏色,所以使用imagefill的話,基本上要么將背景全部填充為一種顏色,要么不填充(默認黑色)。但是一張畫布上作畫時,也許你需要背景色,但很可能不會將整張畫板都涂上一種背景色,旁邊總得留點白紙的地方,所以GD庫提供了能將背景填充成各種具體形狀的方法,如矩形(imagefilledrectangle)、橢圓(imagefilledecllipse)、圓形(橢圓)或扇形(imagefilledarc)、任意多邊形(imagefilledpolygon)等,以橢圓形為例,方法原型:bool imagefilledellipse($image, $cx, $cy, $width, $height, $color),第一個參數資源變量,第二、三個橢圓圓心坐標,四、五設置橢圓寬高度,最后是顏色,簡單如此,注意橢圓的寬高度指長軸長度、短軸長度,而非長半軸、短半軸長度

<?php    $image = imagecreatetruecolor(200, 100);    $background_color = imagecolorallocate($image, 0x13, 0x71, 0x32);    // 填充背景為矩形    imagefilledellipse($image, 100, 50, 200, 100, $background_color);    header('Content-Type: image/png');    imagepng($image);    imagedestroy($image);

      

  3.繪制圖像

  實際上第2步中的背景色填充就是在繪制圖像,只是默認的黑色背景不好看,所以可以先給它填充個另外的顏色。繪圖時也講究個坐標、寬高的問題。老樣子,屏幕坐標原點在左上角,水平往右X值學大,豎直向下Y值越大,以像素為單位。除了imagefill外還有:

    像素點:imagesetpixel  

    直線:imageline

    矩形:imagerectangle

    多邊形:imagepolygon

    橢圓:imageellipse

    圓弧:imagearc

  以上的矩形、多邊形、橢圓均有對應的填充類型函數,即它們只是畫一個簡單的形狀邊線。一段測試代碼

<?php    $width = 200;    $height = 450;    // 創建圖像,得到一個資源變量    $img = imagecreatetruecolor($width, $height);    // 分配顏色    $orange = imagecolorallocate($img, 0xff, 0x66, 0x33);     $creamy_white = imagecolorallocate($img, 0xe8, 0xe9, 0xdb);     $blue = imagecolorallocate($img, 0x1e, 0x90, 0xff);    $green = imagecolorallocate($img, 0x64, 0xb1, 0x67);    $red = imagecolorallocate($img, 0xf6, 0x65, 0x78);    // 填充背景    imagefill($img, 0, 0, $creamy_white);      // 畫線    imageline($img, 10, 10, 100, 60, $orange);        // 畫一個填充的矩形    imagefilledrectangle($img, 10, 70, 160, 150, $blue);     // 畫多邊形    $point_coords = array(10, 160, 50, 170, 120, 270, 5, 250);    imagepolygon($img, $point_coords, count($point_coords)/2, $green);     //imagefilledpolygon($img, $point_coords, count($point_coords)/2, $green); // 畫一個填充多邊形    // 畫一段圓弧    imagearc($img, 80, 310, 80, 80, 0, 240, $orange);    // 畫一個填充的橢圓    imagefilledellipse($img, 80, 400, 150, 70, $red);        header('Content-Type:image/png');    imagepng($img);  // 生成圖像    imagedestroy($img);  // 釋放資源

  效果

    

  例如,畫直線方法原型:boolimageline(resource $image, int $x1, int $y1, int $x2, int $y2, int $color),x1,y1和x2,y2是線的起點和終點坐標,畫直線就是從這個點到哪個點。填充矩形方法中,x1,y1和x2,y2分別對應矩形的左上角和右下角坐標。多邊形的方法:boolimagepolygon(resource $image, array $points, int $num_points, int $color),第二個參數$points是個一維數組,里邊放著多邊形各個頂點的坐標值,最好按照順時針或逆時針圍著多邊形寫,不會遺漏,第三個參數$num_points是頂點個數,所以是第二個坐標值數組的總數除2,這點要注意。畫圓弧imagearc這里是畫個弧線,也有對應的imagefilledarc可以畫一個填充的餅狀弧形。對于畫橢圓imagefilledellipse(resource $image, int $cx, int $cy, int $width, int $height, int $color),$cx、$cy是橢圓中心坐標,$width、$height是指長軸長(寬)、短軸長(高)。

  4. 繪制文字字符串

  除了畫這些圖形,gd庫允許我們畫單個字符和字符串,比如水平畫一個字符串方法:bool imagestring(resource $image, int $font, int $x, int $y, string $s, int $col),$image是圖像句柄,$font是字體類型,gd內置五種字體(貌似除了大小外都差不多)。用int值標識它們(1至5,值越大字越大),傳入其中一個即可,$x、$y是坐標值,指一串字符串的左上角的坐標(參考前面例子)。既然強調了水平畫一個字符串,不出意外就有豎直方向的,確實有:imagestringup,對于畫單個字符同理:imagechar和imagecharup。繪制字符能干什么,最經典的莫過于驗證碼了,試著寫了個簡單的驗證碼類

<?php    class Validcode    {        PRivate $codeNum = 4;   // 驗證碼個數        private $width = 80;    // 圖像寬度        private $height = 20;    // 圖像高度        private $image = false;        // 圖像句柄        private static $colors = array();    // 顏色色值        private $vcodes = '';        // 驗證碼字符串        private static $instance = null;    // 當前實例        private function __construct($num = 4, $width = 80, $height = 20)        {            if(!extension_loaded('gd'))            {                exit('fatal error: no gd extension!');            }            // 規定字符數為3到5個            if((int)$num < 2 || (int)$num > 5)             {                $num = 4;            }            $this->codeNum = (int)$num;            // 限制寬高            $min_width = (imagefontwidth(5) * $this->codeNum) + 10;            $min_height = imagefontheight(5) + 10;            $width < $min_width && $width = $min_width;            $height < $min_height && $height = $min_height;            $this->width = $width;            $this->height = $height;        }        // 獲取單例        public static  function getInstance($num = 4, $width = 80, $height = 20)        {            if(self::$instance === null)            {                self::$instance = new self($num, $width, $height);            }            return self::$instance;        }        /**         * 獲取圖像句柄         */        private function getImage()
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南安市| 泽州县| 米泉市| 贡觉县| 六枝特区| 尚志市| 万盛区| 江津市| 湾仔区| 云龙县| 哈巴河县| 德惠市| 新安县| 拜泉县| 太谷县| 唐河县| 渭源县| 南安市| 汤原县| 巴林右旗| 美姑县| 富宁县| 孝昌县| 磴口县| 镇原县| 安新县| 临沂市| 龙泉市| 台江县| 旌德县| 阿拉尔市| 合肥市| 凌云县| 紫阳县| 府谷县| 达孜县| 铜鼓县| 锡林浩特市| 石屏县| 绥芬河市| 阿克苏市|